緩和された順序付け 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 の前に配列されているにもかかわらず、y の変更順序で D が 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) が入れ替わったことがはっきりとわかります。