C++:将值赋值给原始数据类型(例如布尔值)是原子操作吗?

C++: Is the assignment of a value to a primitive data type (e.g. bool) an atomic operation?

本文关键字:布尔值 原子操作 赋值 数据类型 原始 C++      更新时间:2023-10-16

>想象一下有两个线程,一个为(已经初始化的(布尔值赋值,另一个线程读取/检查这个布尔值。如果对布尔值的访问不受保护或布尔值是非原子的,线程清理器可能会在此处检测到可能的数据争用。

这怎么可能?分配给布尔值是否并不总是原子的,例如,由于缓存层次结构或无序执行等硬件特征?

尽管C++标准没有强制要求这样做,但实际上不可能在 x86 上bool的"中间"获得撕裂效果,即在另一个线程访问它时仅部分更改值。但是,CPU 可能维护它的多个副本,例如作为每个内核的缓存。因此,一个线程可能会在另一个线程完成将其更改为新值后"看到"旧值。std::atomic(特别是在您的情况下std::atomic<bool>(为您提供了内存障碍来解决此问题。