Atomeres Lesen-Ändern-Schreiben: Eine einzelne Operation oder zwei?
Zu Synchronisationszwecken wird atomisches Lesen-Ändern-Schreiben (RMW) verwendet. Operationen wie x.exchange(..., std::memory_order_acq_rel) werfen Fragen bezüglich ihrer Behandlung auf. Werden sie als ein einzelner Vorgang oder als zwei separate Vorgänge betrachtet?
Sichtweise des Standards
Der C-Standard betrachtet RMW-Vorgänge als singuläre Einheiten. Dies geht aus ihrer Benennung hervor und ist in verschiedenen verwandten Sprachen implizit enthalten.
Auswirkungen der Synchronisierung
In Ihrem Beispiel:
x.exchange(1, std::memory_order_acq_rel); // Line A y.store(1, std::memory_order_relaxed); // Line B
Folglich wird der Code reduziert auf:
x.store(1, std::memory_order_release); y.store(1, std::memory_order_relaxed);
Da es zwischen diesen keine Operationen gibt speichert und die entsprechenden Lasten im anderen Thread speichert, wird die Synchronisierung effektiv deaktiviert. Dies ermöglicht die Möglichkeit, 0, 1 zu drucken.
ARM64-Implementierung und Implikation
Die Implementierung von x.exchange() durch ARM64 gibt Anlass zur Sorge. Bei näherer Betrachtung wird jedoch deutlich, dass die Implementierung mit der Sichtweise des Standards auf einen einzelnen RMW-Vorgang übereinstimmt. Die Bestellreihenfolge garantiert, dass der zuletzt gelesene Wert im RMW mit dem Schreibwert übereinstimmt.
Falsches cppreference-Zitat
Der zitierte Text aus cppreference ist ungenau. RMW-Operationen in C werden als einzelne Operationen behandelt und die Neuordnung anderer Operationen davor oder danach ist verboten.
Das obige ist der detaillierte Inhalt vonIst Atomic Read-Modify-Write eine oder zwei einzelne Operationen in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!