如有两个线程,对一个变量进行操作,一个线程读这个变量的值,一个线程往这个变量中写值。即使是一个简单变量的读取和写入操作,如果不加锁,也有可能会导致读写值混乱(一条语句可能会被拆成3、4条汇编语句来执行,所以仍然有可能混乱,如+=操作被拆为先读取再计算再写入)
使用std::mutex可以解决上述对临界资源访问的问题,有时开销会很大。
原子性:指一个操作(或一组操作)不可被中断地执行完毕或不执行。具有原子性的操作不会受到其他并发操作的干扰,能够保证数据的一致性和正确性。通俗来说,原子性就是"一气呵成",不可分割的意思。在多线程编程中,原子性非常重要,因为如果一个操作不具备原子性,可能会导致数据出现错误或者不一致的情况(如上述的+=)。
std::atomic<T>包含在头文件<atomic>中,实现原子操作,不需要用到互斥量加锁(无锁)技术的多线程并发编程方式。从效率上来说,原子操作要比互斥量的方式效率要高。互斥量的加锁一般是针对一个代码段,而原子操作针对的一般都是一个变量。std::atomic来代表原子操作,是个类模板。其实std::atomic是用来封装某个类型的值。支持变量的++,--,+=,-=,&=,|=,^=操作的原子性。
参考:
【C++多线程】std::atomic<T> - Chen沉尘 - 博客园 (cnblogs.com)
原子性是什么意思?-CSDN博客