重複の可能性:
同時実行: C++11 メモリ モデルのアトミックおよび揮発性
C++11<atomic>
仕様では、鮮度の保証はありますか? さまざまなメモリ順序の説明は、並べ替えのみを扱っています (私が見た限り)。
具体的には、この状況では:
#include <atomic>
std::atomic<int> cancel_work(0);
// Thread 1 is executing this function
void thread1_func() {
...
while (cancel_work.load(<some memory order>) == 0) {
...do work...
}
}
// Thread 2 executes this function
void thread2_func() {
...
cancel_work.store(1, <some memory order>);
...
}
スレッド 1 とスレッド 2 が 以外のデータを共有しない場合、順序の保証は必要なく、ストアとロードの両方で十分であるcancel_work
ように思えます。しかし、これは、スレッド 1 がローカル キャッシュ ラインをメイン メモリから更新せずに繰り返し読み取るのではなくstd::memory_order_relax
、更新を確認することを保証するものでしょうか? cancel_work
そうでない場合、その保証を行うために最低限必要なものは何ですか?