Ослабленное упорядочение Атомарные операции с тегами 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 появиться перед A в порядке модификации y, а 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
...
под GCC 4.6.1 с опцией -02
так что мы ясно видим, что (A) и (B) поменялись местами