2017-08-15 18 views
0

のは、(私は、少なくとも願っています)我々はそれが正しいコードのこの部分を持っているとしましょう:ミックス原子と非アトミック変数とキャッシュ

std::atomic<int> a; 
std::atomic<bool> ready{false}; 
void threadA() { 
    a.store(666, std::memory_order_relaxed); 
    ready.store(true, std::memory_order_release); 
} 

void threadB() { 
    while(!ready.load(std::memory_order_acquire)); 
    process(a.load(std::memory_order_relaxed)); 
} 

私の質問は:ケースでは、代わりにint a;を使用していますstd::atomic<int> a;の場合は正しいですか?または、キャッシュのフラッシング/無効化の問題がありますか?これは一例として、あなたのコードは大丈夫です、良いアイデアであるか否かは、

+0

あなたが...尋ねるシーケンシャル一貫性を使用する必要がある場合です。あなたが何をやっているのか分かっていても、あなたのコードを管理している人は、ひどくコメントしカプセル化していない限り、そうではありません。 –

+0

それは実際に特定の用途のためではありません。それは他の何かよりも理論のためです。 しかし、このコードは逐次整合性で動作しますか? –

+1

それは私にはうまく見えます。私はあなたに「原子兵器」という講演会を見ることを勧めます。それ以降、私にはすべて意味がありました。 https://www.youtube.com/watch?v=c1gO9aB9nbs –

答えて

1

..

あなたが定期的にintaの原子タイプ(またはそのことについては任意の型)を置き換えることができます。

特定のライブラリ呼び出しが別のスレッドによって実行される他のライブラリ呼び出しと同期:
C++標準では、次の語句(1.10.1-6条)とあなたのケースをサポートしています。例えば、アトミックストア放出は

threadBので負荷がストアからthreadA(それがループ内でそれを待っている)、によって記憶されreadyの値を、その値をとる負荷取得と同期同期 -関係が確立されています。 したがって、a.load()a.store()のメモリ効果を観察します。これを言うための別の方法はa.store()が起こる-の前にいることをa.load()

+0

ええ、私の質問はもっと詳しくです:原子変数を非原子変数で置き換えるのは正しいですか?あなたは冒頭で答えました;) –

関連する問題