LLVM での C++11 アトミックの実装に関するこのトークを見ていると、このコードがありました。
-- Initially --
int x = 0;
std::atomic<bool> flag1{false}, flag2{false};
-- Thread 1 --
x = 42;
flag1.store(true, std::memory_order_release);
while(!flag2.load(std::memory_order_acquire));
x = 43;
-- Thread 2 --
while(!flag1.load(std::memory_order_acquire));
printf("%d", x);
flag2.store(true, std::memory_order_release);
私はこのコードにデータ競合がないと考えています (講演者も述べているように) 42
。
ただし、印刷されるかどうかは42
わかりません。私の質問は次のとおりです。両方のスレッドがデッドロックするように、コンパイラがスレッド 1 の while ループを過ぎてストアを並べ替えることができないでしょうか? または、C++11 標準のどの部分がそのような動作を防いでいるのでしょうか?