Werden zwei Atomare an verschiedene Orte in verschiedenen Threads in der gleichen Reihenfolge von anderen Threads zu sehC++

Programme in C++. Entwicklerforum
Anonymous
 Werden zwei Atomare an verschiedene Orte in verschiedenen Threads in der gleichen Reihenfolge von anderen Threads zu seh

Post by Anonymous »

Ähnlich wie bei meiner vorherigen Frage beachten Sie diesen Code < /p>

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);
Ist das seltsame Ergebnis r1 == 1, r2 == 0 und r3 == 2, r4 == 0 In diesem Fall unter dem Speichermodell C ++ 11 möglich? Was wäre, wenn ich alle std :: memory_order_acq_rel < /code> durch std :: memory_order_relaxed < /code>? < /P>

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?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post