ある場所へのストアはstd::memory_order_release
、別の場所からの後続のロードで並べ替えることができますstd::memory_order_acquire
。
しかし、ある場所へのストアはstd::memory_order_release
、別の場所からの後続のロードで再注文できstd::memory_order_seq_cst
ますか?
同様にstd::memory_order_seq_cst
、変数へのストアを別の場所からの後続のロードで並べ替えることができstd::memory_order_acquire
ますか?
次の例を検討してください。
std::atomic<int> x{0};
std::atomic<int> y{0};
void thread1() {
x.store(std::memory_order_release, 1);
int r1 = y.load(std::memory_order_seq_cst);
std::cout << r1 << std::endl;
}
void thread2() {
y.store(std::memory_order_seq_cst, 1);
int r2 = x.load(std::memory_order_acquire);
std::cout << r2 << std::endl;
}
両方が対応する release/acquire に置き換えられた場合、出力std::memory_order_seq_cst
が 2回「0」。
この例では、逐次一貫性によって何かが得られますか?それとも、出力が「0」の 2 倍のままになる可能性がありますか?