Behandlung von atomaren Read-Modify-Write (RMW)-Operationen in der Speicherordnung
Als Antwort auf die Frage nach der Natur des atomaren Lesens -Modify-Write-Operationen (RMW) werden vom C-Standard als einzelne Operationen mit einer Semantik klassifiziert, die sowohl Erwerb als auch Freigabe kombiniert Eigenschaften.
Auswirkungen auf die Reihenfolge
Diese Bezeichnung impliziert, dass keine im selben Thread auftretenden Speicherlese- oder -schreibvorgänge vor oder nach einem RMW-Vorgang neu angeordnet werden können. Dies schließt jedoch nicht die Möglichkeit einer Neuordnung zwischen den internen Lese- und Schreibkomponenten des RMW aus.
Konkretes Beispiel
Betrachten Sie das bereitgestellte Codebeispiel:
std::atomic<int> x, y; void thread_A() { x.exchange(1, std::memory_order_acq_rel); y.store(1, std::memory_order_relaxed); } void thread_B() { int yy = y.load(std::memory_order_acquire); int xx = x.load(std::memory_order_acquire); std::cout << xx << ", " << yy << std::endl; }
In diesem Szenario kann Thread B tatsächlich 0, 1 ausgeben. Dies liegt daran, dass die Lade- und Speichervorgänge innerhalb von Thread A ausgeführt werden Der RMW-Vorgang kann intern neu angeordnet werden, sodass Thread B den Status nach dem Laden (0), aber vor dem Speichern (1) beobachten kann.
ARM64-Implementierung
Die ARM64-Implementierung Der RMW-Vorgang, wie er in den Anweisungen ldaxr, stlxr und str beschrieben wird, entspricht den Erwartungen des Standards. Die str-Anweisung kann vor der stlxr-Anweisung sichtbar sein, was möglicherweise zur Beobachtung von 0, 1 durch Thread B führt.
Auswirkungen auf die Speicherreihenfolge
Das Ersetzen von „memory_order_acq_rel“ durch „seq_cst“ würde dies tun hat keinen Einfluss auf dieses Verhalten, da es nur zusätzliche Semantik im Vergleich zu anderen seq_cst-Operationen einführt, die nicht im Code vorhanden sind Beispiel.
Fazit
Atomere RMW-Operationen in C sind singuläre Operationen mit Acquire-Release-Semantik. Während sie die Neuordnung externer Vorgänge vorher und nachher verhindern, ermöglicht die Möglichkeit der Neuordnung zwischen ihren internen Komponenten Szenarios wie das im Codebeispiel, in dem Thread B 0, 1 ausgeben kann.
Das obige ist der detaillierte Inhalt vonWie wirken sich interne Neuordnungen in C-Atomic-Read-Modify-Write-Vorgängen auf die Speicherordnung aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!