http://gcc.gnu.org/wiki/Atomic/GCCMM/AtomicSync
假设
x
最初为0:
-Thread 1-
x.store (1, memory_order_relaxed)
x.store (2, memory_order_relaxed)
-Thread 2-
y = x.load (memory_order_relaxed)
z = x.load (memory_order_relaxed)
assert (y <= z)
断言不能失败。
我不明白为什么两个负载不能重新排序,以便在
z
之前读取y
,这可以给出z = 1
和y = 2
,因此y <= z
失败。
同一个线程对same对象的操作被重新排序;每个对象的单独修改顺序是跨线程的程序顺序的某种交错。
真正的硬件可以免费做到这一点,因此 C++ 可以免费提供这种保证。 (并且不允许编译时重新排序,一旦尘埃落定,这可能会导致长期值错误。)
如果后面的存储首先暂时可见,则该值必须更改两次才能获得正确的最终值。再说一遍,由于缓存一致性,真正的硬件并没有那么弱/疯狂。 http://eel.is/c++draft/intro.races#19