对同一对象重新排序宽松的原子操作

问题描述 投票:0回答:1

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
失败。

c++ atomic memory-barriers stdatomic memory-model
1个回答
0
投票

同一个线程对same对象的操作被重新排序;每个对象的单独修改顺序是跨线程的程序顺序的某种交错。

真正的硬件可以免费做到这一点,因此 C++ 可以免费提供这种保证。 (并且不允许编译时重新排序,一旦尘埃落定,这可能会导致长期值错误。)

如果后面的存储首先暂时可见,则该值必须更改两次才能获得正确的最终值。再说一遍,由于缓存一致性,真正的硬件并没有那么弱/疯狂。 http://eel.is/c++draft/intro.races#19

© www.soinside.com 2019 - 2024. All rights reserved.