放宽排序 标记为 std::memory_order_relaxed 的原子操作不是同步操作,它们不对内存进行排序。它们只保证原子性和修改顺序的一致性。例如,x 和 y 最初为零,
// Thread 1:
r1 = y.load(memory_order_relaxed); // A
x.store(r1, memory_order_relaxed); // B
// Thread 2:
r2 = x.load(memory_order_relaxed); // C
y.store(42, memory_order_relaxed); // D
允许产生 r1 == r2 == 42,因为尽管 A 在 B 之前排序并且 C 在 D 之前排序,但没有什么可以阻止 D 在 y 的修改顺序中出现在 A 之前,并且 B 在修改中出现在 C 之前x 的顺序。
问题:是什么赋予上述代码属性A 在 B 之前排序而C 在 D 之前排序?
编辑:
int A, B;
void foo()
{
A = B + 1; (A)
B = 0; (B)
}
导致
$ gcc -O2 -S -masm=intel foo.c
$ cat foo.s
...
mov eax, DWORD PTR B
mov DWORD PTR B, 0
add eax, 1
mov DWORD PTR A, eax
...
在带有 -02 选项的 GCC 4.6.1 下
所以我们清楚地看到(A)和(B)已经切换了