一个布尔值,读/写操作可以在x86不是原子?(Can a bool read/write opera

2019-07-19 01:13发布

假设我们有两个线程,一个是在一个循环中读取一个布尔值,另一个可以在某些时候切换了。 我个人认为这应该是由于原子sizeof(bool)在C ++中是1个字节,你不部分的读/写字节,但我想是100%肯定。

所以,是或否?

编辑

还以供将来参考,并同样适用于int

Answer 1:

这一切都取决于你实际上是由单词“原子”的意思。

你的意思是“最终值将一次过更新”(是的,在x86这绝对保证一个字节值 - 任何正确对齐价值高达64位,至少),或者“如果我设置为true(或假的),没有其他线程将读取不同的值我设置后,”(这并不完全这样的肯定 - 你需要一个‘锁定’的前缀,以保证)。



Answer 2:

有三个独立的问题是“原子”类型的C ++ 11个地址:

  1. 撕裂:读或写涉及多个总线周期,并且在操作过程中发生线程切换; 这可能会产生不正确的值。

  2. 高速缓存一致性:从一个线程写入更新它的处理器的缓存,但不更新全局内存; 从不同的线程读取读取全局内存,并且不会看到在其他处理器的缓存更新后的值。

  3. 编译器的优化:编译器打乱顺序读取和假设值是不是从另一个线程访问,从而导致混乱之下写道。

使用std::atomic<bool>确保所有这三个问题,正确地管理。 不使用std::atomic<bool>让你猜,有,在最好的,不可移植的代码。



Answer 3:

86只保证字对齐的读取和字大小写。 它并不能保证任何其他操作,除非明确原子。 另外,当然,你要说服你的编译器实际问题的相关读取并在第一时间写。



文章来源: Can a bool read/write operation be not atomic on x86?