C++:将值赋值给原始数据类型(例如布尔值)是原子操作吗?
C++: Is the assignment of a value to a primitive data type (e.g. bool) an atomic operation?
>想象一下有两个线程,一个为(已经初始化的(布尔值赋值,另一个线程读取/检查这个布尔值。如果对布尔值的访问不受保护或布尔值是非原子的,线程清理器可能会在此处检测到可能的数据争用。
这怎么可能?分配给布尔值是否并不总是原子的,例如,由于缓存层次结构或无序执行等硬件特征?
尽管C++标准没有强制要求这样做,但实际上不可能在 x86 上bool
的"中间"获得撕裂效果,即在另一个线程访问它时仅部分更改值。但是,CPU 可能维护它的多个副本,例如作为每个内核的缓存。因此,一个线程可能会在另一个线程完成将其更改为新值后"看到"旧值。std::atomic
(特别是在您的情况下std::atomic<bool>
(为您提供了内存障碍来解决此问题。
相关文章:
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 变量定义到C++布尔值转换
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 重载更少,则运算符返回相反的布尔值
- 将 10 个线程与原子布尔值同步
- C++:将值赋值给原始数据类型(例如布尔值)是原子操作吗?
- 原子变量的多重赋值是原子操作吗?
- std::原子布尔值或普通全局布尔值在单线程中很好吗?
- 原子布尔值无法保护非原子计数器
- 编译器中的布尔值为 8 位.对它们的操作是否效率低下
- 调整 std::vector<std::atomic_bool> 的大小,为所有原子布尔值分配 true
- C++:标准::原子<bool>和挥发性布尔值
- 赋值操作在C中隐式计算为什么布尔值
- 对循环和字符串函数中的指针的操作以及布尔值
- C++11当递增原子变量,并将其赋值给其他值时,就是原子操作
- 标准的原子布尔值和原子标志之间的区别
- 在vc++的一个原子操作中设置POD的值
- 在线程间的控制流中使用不带互斥锁的非原子布尔值是否安全?
- 有没有办法用布尔值做类似"post switch"的操作?
- 原子<bool>与布尔值受互斥锁保护