std::atomic为C++11封装的原子数据类型。
什么是原子数据类型?
从功能上看,简单地说,原子数据类型不会发生数据竞争,能直接用在多线程中而不必我们用户对其进行添加互斥资源锁的类型。从实现上,大家可以理解为这些原子类型内部自己加了锁。
我们下面通过一个测试例子说明原子类型std::atomic_int的特点。
二 使用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
最终结果为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