In der Dokumentation von std::memory_order
cppreference.com finden Sie ein Beispiel für eine entspannte Bestellung:
Entspannte Bestellung
Mit Tags versehene atomare Operationen
memory_order_relaxed
sind keine Synchronisationsoperationen. Sie legen keine Reihenfolge bei gleichzeitigen Speicherzugriffen fest. Sie garantieren nur die Konsistenz der Atomizität und der Änderungsreihenfolge.Zum Beispiel, wenn x und y anfänglich Null sind,
// Thread 1: r1 = y.load(std::memory_order_relaxed); // A x.store(r1, std::memory_order_relaxed); // B // Thread 2: r2 = x.load(std::memory_order_relaxed); // C y.store(42, std::memory_order_relaxed); // D
darf r1 == r2 == 42 erzeugen, denn obwohl A vor B in Thread 1 und C vor D in Thread 2 sequenziert wird , hindert nichts D daran, vor A in der Änderungsreihenfolge von y und B vor zu erscheinen erscheint vor C in der Änderungsreihenfolge von x. Die Nebenwirkung von D auf y könnte für die Last A in Gewinde 1 sichtbar sein, während die Nebenwirkung von B auf x für die Last C in Gewinde 2 sichtbar sein könnte. Dies kann insbesondere auftreten, wenn D vor C in abgeschlossen ist Thread 2, entweder aufgrund einer Neuordnung des Compilers oder zur Laufzeit.
es heißt "C wird vor D in Thread 2 sequenziert".
Gemäß der Definition von "vorher sequenziert", die in der Reihenfolge der Bewertung zu finden ist, wird die Bewertung von A abgeschlossen, bevor die Bewertung von B beginnt, wenn A vor B sequenziert wird. Da C vor D in Thread 2 sequenziert wird, muss C abgeschlossen sein, bevor D beginnt, daher wird der Bedingungsteil des letzten Satzes des Schnappschusses niemals erfüllt.