Heim >Backend-Entwicklung >C++ >Handelt es sich bei C Atomic Read-Modify-Write-Vorgängen um einzelne Vorgänge mit Acquire-Release-Semantik oder um eine Folge von Lade- und Speichervorgängen?

Handelt es sich bei C Atomic Read-Modify-Write-Vorgängen um einzelne Vorgänge mit Acquire-Release-Semantik oder um eine Folge von Lade- und Speichervorgängen?

Barbara Streisand
Barbara StreisandOriginal
2024-12-07 19:22:13304Durchsuche

Are C   Atomic Read-Modify-Write Operations Single Operations with Acquire-Release Semantics, or a Sequence of Loads and Stores?

Speicherordnung mit atomaren Lese-, Änderungs- und Schreiboperationen

In C werden atomare Lese-, Änderungs- und Schreiboperationen (RMW) wie x .exchange() erzwingt spezifische Bestellgarantien in Bezug auf andere Ladungen und Geschäfte. Es stellt sich die Frage, ob diese Vorgänge berücksichtigt werden:

  1. Ein einzelner Vorgang mit Acquire-Release-Semantik
  2. Ein Acquire-Load, gefolgt von einem Release-Store mit zusätzlichen Garantien

Standardperspektive

Gemäß dem C-Standard werden RMW-Operationen als Einzeloperationen behandelt. Dies wird durch ihren singulären Namen und den dazugehörigen Wortlaut impliziert.

ARM64-Implementierung

In ARM64 werden RMW-Operationen als eine Folge von Lade-, Atomaustausch- und Speicheranweisungen implementiert . Während diese Implementierung theoretisch ermöglicht, dass die Speicheranweisung vor dem atomaren Austausch sichtbar wird, hat dies keinen Einfluss auf die Speicherordnungsgarantien des Standards.

Speichersynchronisation

Speichersynchronisation in C basiert hauptsächlich auf der Synchronisierungsbeziehung zwischen Freigabe- und Erfassungsvorgängen. Im bereitgestellten Codebeispiel:

  • x.exchange(1, std::memory_order_acq_rel): Der Erwerb der Synchronizes-with-Beziehung spielt keine Rolle, da es keine nachfolgenden Geschäfte zu x gibt.
  • x.load(std::memory_order_acquire): Das Laden von x wird mit nichts synchronisiert, was es effektiv macht entspannt.

Synchronisationsanalyse

Da es keine anderen Vorgänge zum Synchronisieren gibt, ergibt sich folgender Ablauf:

  1. Speichern nach y
  2. Last auf y (entspannt)
  3. Last auf x (entspannt)

Mögliche Ausgabe

Daher kann der Code tatsächlich 0, 1 ausgeben. Die Perspektive des Standards impliziert, dass die RMW-Operation eine einzelne Operation mit ist Keine zusätzlichen Garantien, die diese Ausgabe ermöglichen.

Das obige ist der detaillierte Inhalt vonHandelt es sich bei C Atomic Read-Modify-Write-Vorgängen um einzelne Vorgänge mit Acquire-Release-Semantik oder um eine Folge von Lade- und Speichervorgä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