Heim >Backend-Entwicklung >C++ >Ist ein atomares Lese-, Änderungs- und Schreibvorgang ein einzelner Vorgang oder eine Folge von Erfassungs- und Freigabevorgängen?

Ist ein atomares Lese-, Änderungs- und Schreibvorgang ein einzelner Vorgang oder eine Folge von Erfassungs- und Freigabevorgängen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-01 14:06:13796Durchsuche

Is an Atomic Read-Modify-Write a Singular Operation or a Sequence of Acquire-Release Operations?

Unterscheidung zwischen singulären und separaten Operationen beim atomaren Lesen-Ändern-Schreiben

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn