53

どちらも、ストアはリリース操作であり、ロードは取得操作です。すべての操作に追加の合計順序を課すことを意図していることは知っていますが、すべてが に置き換えられmemory_order_seq_cstた場合にそうではない例を作成できていません。memory_order_seq_cstmemory_order_acq_rel

私は何かを見逃していますか、それとも違いは単なるドキュメンテーション効果です。つまりmemory_order_seq_cst、よりリラックスしたモデルで遊ぶつもりがない場合に使用memory_order_acq_relし、リラックスしたモデルを制約するときに使用する必要がありますか?

4

4 に答える 4

48

http://en.cppreference.com/w/cpp/atomic/memory_orderの一番下に、 でのみ機能する良い例がありmemory_order_seq_cstます。基本memory_order_acq_rel的に、アトミック変数に相対的な読み取りと書き込みの順序付けをmemory_order_seq_cst提供する一方で、グローバルな読み取りと書き込みの順序付けを提供します。つまり、順次一貫性のある操作は、すべてのスレッドで同じ順序で表示されます。

この例は次のようになります。

bool x= false;
bool y= false;
int z= 0;

a() { x= true; }
b() { y= true; }
c() { while (!x); if (y) z++; }
d() { while (!y); if (x) z++; }

// kick off a, b, c, d, join all threads
assert(z!=0);

の操作zは、1 つではなく 2 つのアトミック変数によって保護されるため、取得と解放のセマンティクスを使用してz常にインクリメントすることを強制することはできません。

于 2012-09-09T16:45:57.567 に答える