2012-09-09 8 views
17

ストアはリリース操作であり、ロードは両方の操作を取得します。私はmemory_order_seq_cstがすべての操作のために追加の合計発注を課すことを意図していることを知っていますが、memory_order_seq_cstがすべてmemory_order_acq_relに置き換えられていない場合の例を作るのに失敗しています。memory_order_seq_cstとmemory_order_acq_relはどのように異なるのですか?

私は何かが間違っているか、その違いは単なるドキュメントエフェクトです。つまり、よりリラックスしたモデルで再生しない場合はmemory_order_seq_cstを使用し、リラックスしたモデルを制限する場合はmemory_order_acq_relを使用します。

答えて

18

http://en.cppreference.com/w/cpp/atomic/memory_orderは、memory_order_seq_cstとのみ動作する良い例です。本質的にmemory_order_acq_relは、原子変数に関連した読み書き順序を提供し、memory_order_seq_cstは、読み書き順序をグローバルに提供します。つまり、すべてのスレッドで、一貫性のある操作が同じ順序で表示されます。

例はこれに沸く:あなたはzを常にインクリメントされていることを強制するために取得・リリース・セマンティクスを使用することはできませんのでz

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); 

操作は、2つのアトミック変数ではなく、1によって守られています。

+0

なぜ 'x = true; y = true; c(); d()'はできないのですか?それは0になるはずです。また、なぜ私は結果として2をたくさん得ているのかわかりません。 –

+1

@ acidzombie24、その場合でも、 'z'は2になります。 – MSN

+0

コードが誤っています。それは今、完璧な意味があります –

関連する問題