假设我们有两个线程,一个是在一个循环中读取一个布尔值,另一个可以在某些时候切换了。 我个人认为这应该是由于原子sizeof(bool)
在C ++中是1个字节,你不部分的读/写字节,但我想是100%肯定。
所以,是或否?
编辑 :
还以供将来参考,并同样适用于int
?
假设我们有两个线程,一个是在一个循环中读取一个布尔值,另一个可以在某些时候切换了。 我个人认为这应该是由于原子sizeof(bool)
在C ++中是1个字节,你不部分的读/写字节,但我想是100%肯定。
所以,是或否?
编辑 :
还以供将来参考,并同样适用于int
?
这一切都取决于你实际上是由单词“原子”的意思。
你的意思是“最终值将一次过更新”(是的,在x86这绝对保证一个字节值 - 任何正确对齐价值高达64位,至少),或者“如果我设置为true(或假的),没有其他线程将读取不同的值我设置后,”(这并不完全这样的肯定 - 你需要一个‘锁定’的前缀,以保证)。
有三个独立的问题是“原子”类型的C ++ 11个地址:
撕裂:读或写涉及多个总线周期,并且在操作过程中发生线程切换; 这可能会产生不正确的值。
高速缓存一致性:从一个线程写入更新它的处理器的缓存,但不更新全局内存; 从不同的线程读取读取全局内存,并且不会看到在其他处理器的缓存更新后的值。
编译器的优化:编译器打乱顺序读取和假设值是不是从另一个线程访问,从而导致混乱之下写道。
使用std::atomic<bool>
确保所有这三个问题,正确地管理。 不使用std::atomic<bool>
让你猜,有,在最好的,不可移植的代码。
86只保证字对齐的读取和字大小写。 它并不能保证任何其他操作,除非明确原子。 另外,当然,你要说服你的编译器实际问题的相关读取并在第一时间写。