Code: Select all
-- Initially --
std::atomic x{0};
std::atomic 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);
ersetzen würde. Frage:
Wir sind uns alle einig, dass mit std :: memory_order_seq_cst das -Erd -Ergebnis in C ++ 11 nicht erlaubt wäre. Jetzt sagte Herb Sutter in seinem berühmten Atomic -Waffengespräch @ 42:30, dass std :: memory_order_seq_cst genau wie std :: memory_order_acq_rel Aber std :: memory_acquire-code> -Code> -Code> -Loads sich nicht bewegt. Ich kann nicht sehen, wie diese zusätzliche Einschränkung im obigen Beispiel das seltsame Ergebnis verhindern würde. Kann jemand erklären?