std::atomic為C++11封裝的原子數(shù)據(jù)類型。
什么是原子數(shù)據(jù)類型?
從功能上看,簡單地說,原子數(shù)據(jù)類型不會發(fā)生數(shù)據(jù)競爭,能直接用在多線程中而不必我們用戶對其進(jìn)行添加互斥資源鎖的類型。從實(shí)現(xiàn)上,大家可以理解為這些原子類型內(nèi)部自己加了鎖。
我們下面通過一個(gè)測試?yán)诱f明原子類型std::atomic_int的特點(diǎn)。
二 使用atomic版本
代碼
#include <thread>
#include <atomic>
#include <iostream>
#include <list>
using namespace std;
atomic_int iCount(0);
void threadfun1()
{
for(int i =0; i< 1000; i++)
{
printf("iCount:%d\r\n", iCount++);
}
}
void threadfun2()
{
for(int i =0; i< 1000; i++)
{
printf("iCount:%d\r\n", iCount--);
}
}
int main()
{
std::list<thread> lstThread;
for (int i=0; i< 100; i++)
{
lstThread.push_back(thread(threadfun1));
}
for (int i=0; i< 100; i++)
{
lstThread.push_back(thread(threadfun2));
}
for (auto& th: lstThread)
{
th.join();
}
//printf("finally iCount:%d\r\n", iCount);
int x = iCount.load(memory_order_relaxed);
printf("finally iCount:%d\r\n", x);
}
輸出
g++ -std=c++14 -pthread -o out atomictest.cpp && ./out
iCount:-4
iCount:-3
iCount:-2
iCount:-1
finally iCount:0
最終結(jié)果為0
二 不使用atomic版本
#include <thread>
#include <atomic>
#include <iostream>
#include <list>
using namespace std;
int iCount=0;
void threadfun1()
{
for(int i =0; i< 1000; i++)
{
printf("iCount:%d\r\n", iCount++);
}
}
void threadfun2()
{
for(int i =0; i< 1000; i++)
{
printf("iCount:%d\r\n", iCount--);
}
}
int main()
{
std::list<thread> lstThread;
for (int i=0; i< 100; i++)
{
lstThread.push_back(thread(threadfun1));
}
for (int i=0; i< 100; i++)
{
lstThread.push_back(thread(threadfun2));
}
for (auto& th: lstThread)
{
th.join();
}
printf("finally iCount:%d\r\n", iCount);
}
輸出
g++ -std=c++14 -pthread -o out atomictest.cpp && ./out
...
iCount:-9
iCount:-8
iCount:-7
iCount:-6
finally iCount:-5