私の前の質問と同様に、このコードを検討してください
-- Initially --
std::atomic<int> x{0};
std::atomic<int> y{0};
-- Thread 1 --
x.store(1, std::memory_order_release);
-- Thread 2 --
y.store(2, std::memory_order_release);
-- Thread 3 --
int r1 = x.load(std::memory_order_acquire); // x first
int r2 = y.load(std::memory_order_acquire);
-- Thread 4 --
int r3 = y.load(std::memory_order_acquire); // y first
int r4 = x.load(std::memory_order_acquire);
この場合、C ++ 11メモリモデルの下で奇妙な結果 r1==1, r2==0
と可能性はありますか? r3==2, r4==0
すべてを に置き換えるとどうなりstd::memory_order_acq_rel
ますstd::memory_order_relaxed
か?
x86 では、このような結果は禁止されているようです。この SO の質問を参照してください。ただし、一般的な C++11 メモリ モデルについて質問しています。
おまけの質問:
C++11 では奇妙な結果std::memory_order_seq_cst
が許容されないことに、私たちは皆同意しています。さて、Herb Sutter は彼の有名な-weapons talk @ 42:30 で言いましたが、それは-loads may not move before -writesのようなものです。上記の例のこの追加の制約が、奇妙な結果を防ぐ方法がわかりません。誰でも説明できますか?atomic<>
std::memory_order_seq_cst
std::memory_order_acq_rel
std::memory_order_acquire
std::memory_order_release