Heim >Backend-Entwicklung >C++ >Ist ein atomares Lese-, Änderungs- und Schreibvorgang ein einzelner Vorgang oder eine Folge von Erfassungs- und Freigabevorgängen?
Im Kontext der Speicherordnung das Verhalten des atomaren Lesens-Ändern-Schreibens (RMW) Operationen wie x.exchange(...) mit std::memory_order_acq_rel werfen eine Frage auf: Wird diese Operation behandelt als eine einzelne Entität mit Acquire-Release-Semantik oder als eine Folge von Operationen, die eine Acquire-Last gefolgt von einem Release-Store umfassen?
Standardperspektive: Singular Operation
Gemäß der Im C-Standard wird eine RMW-Operation als singuläre Operation betrachtet. Diese Implikation ergibt sich aus dem Namen, der die Singularform verwendet, und dem zugehörigen Wortlaut der Norm. Daher wird in diesem Zusammenhang die Operation x.exchange(...) als eine einzelne Einheit betrachtet.
Auswirkungen auf die Reihenfolge: Mögliche Neuordnung
Wenn wir Folgendes berücksichtigen Aus Sicht des Standards hat der bereitgestellte Code das Potenzial, 0, 1 auszugeben. Diese Möglichkeit ergibt sich, weil der Standard nicht im Hinblick auf die Neuordnung von Operationen definiert ist, sondern vielmehr im Hinblick auf die Synchronisationsbeziehung zwischen Release und Vorgänge erwerben.
Insbesondere hat der Vorgang y.load(acquire) keinen passenden Release-or-Stronger-Speicher. Daher wird es nicht mit anderen Vorgängen synchronisiert und effektiv als entspanntes Laden (y.load(relaxed)) behandelt.
Außerdem ist dies bei der „acquire“-Komponente des x.exchange(1, acq_rel)-Vorgangs der Fall Es gibt keine Speicher, mit denen synchronisiert werden kann, wodurch die Erfassungssemantik effektiv vereinfacht wird. Dadurch wird es effektiv in eine x.store(1, release)-Operation umgewandelt.
Da es vor dem Speichern und nach dem Laden von x in den jeweiligen Threads keine Operationen gibt, wird die mögliche Synchronisierung zwischen diesen Operationen überflüssig. Folglich können beide Lasten entweder 0 oder 1 zurückgeben, was die Ausgabe 0, 1 ermöglicht.
Schlussfolgerung
Aus der Sicht des C-Standards ist ein atomares Lese- Der Änderungs-/Schreibvorgang wird als einzelner Vorgang betrachtet. Dieses Verständnis impliziert, dass der Code im bereitgestellten Beispiel aufgrund der fehlenden Synchronisierung zwischen den Lasten und Speichern möglicherweise 0, 1 ausgibt.
Das obige ist der detaillierte Inhalt vonIst ein atomares Lese-, Änderungs- und Schreibvorgang ein einzelner Vorgang oder eine Folge von Erfassungs- und Freigabevorgängen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!