6

http://en.cppreference.comから:

緩和された順序付け 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) が入れ替わったことがはっきりとわかります。

4

3 に答える 3

6

sequenced-before ( happens-beforeとは異なります) の関係は、マルチスレッドに固有のものではありません。それらはシングルスレッドプログラムでも発生します。セミコロンで終わる式はすべて次の式の前に配列されます。この場合、それぞれが完全な式であるため、前後にA配列されます。BCD

標準1.9 プログラム実行 14から:

完全な式に関連付けられたすべての値の計算と副作用は、評価される次の完全な式に関連付けられたすべての値の計算と副作用の前に並べられます。

ここで説明を見つけることができます:

評価の順序

于 2014-12-13T20:20:15.680 に答える