在并发多线程的编程中,不同线程间对共享内存的竞争是存在一定危险的。所以C++11引入了自己的互斥量的概念来避免在多线程的运行中出现的问题,那么对于每次的加锁解锁以及其他的操作对于资源的消耗都是一定的,那么就又引入了std::atomic的类模板,实现了原子操作,从而避免了在数据的修改过程中被切换到另一个线程中,也就是说对于值的修改操作必须一次性执行完毕,中途不会被打断。atomic的运行效率上比互斥锁的效率要高好多。但是对于atomic和mutex的实际需要还需要根据设定情况来看,没有绝对的完美和高效。
std::atomic的用法简单,定义一个你所需要的变量就好,可以实现++,--,+=等操作,但是对于x = x + 1就不可用。
#include <iostream>
#include <atomic>
#include <thread>
std::atomic<int> myat;
void fun() {
for (int i = 0; i < 100000; i++) {
myat++;
}
}
int main()
{
std::thread t1(fun);
std::thread t2(fun);
t1.join();
t2.join();
std::cout << myat << std::endl;
return 0;
}