什么是原子数据类型?
从功能上看,简单地说,原子数据类型不会发生数据竞争,能直接用在多线程中而不必我们用户对其进行添加互斥资源锁的类型。从实现上,大家可以理解为这些原子类型内部自己加了锁。
#include <thread>
#include <atomic>
#include <iostream>
#include <list>
using namespace std;
// 使用原子类型
// atomic_int iCount(0);
void threadFun1(void) {
for (int i = 0; i < 1000; i++) {
printf("iCount: %d\r\n", iCount++);
}
}
void threadFun2(void) {
for (int i = 0; i < 1000; i++) {
printf("iCount: %d\r\n", iCount--);
}
}
int main(void) {
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();
}
int x = iCount.load(memory_order_relaxed);
printf("finally iCount:%d\r\n", x);
// return value
return 0;
}
运行结果:
不用原子类型数据:
#include <thread>
#include <atomic>
#include <iostream>
#include <list>
using namespace std;
// 不用原子类型
int iCount = 0;
void threadFun1(void) {
for (int i = 0; i < 1000; i++) {
printf("iCount: %d\r\n", iCount++);
}
}
void threadFun2(void) {
for (int i = 0; i < 1000; i++) {
printf("iCount: %d\r\n", iCount--);
}
}
int main(void) {
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);
// return value
return 0;
}
运行结果:
小结:
Linux环境下运行,参数配置为:g++ -std=c++11 -pthread 14.atomictest.cpp
,结果均为一样!