Heim >Backend-Entwicklung >C++ >Ist Atomic Read-Modify-Write eine oder zwei einzelne Operationen in C?

Ist Atomic Read-Modify-Write eine oder zwei einzelne Operationen in C?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-05 02:13:09496Durchsuche

Is Atomic Read-Modify-Write a Single Operation or Two in C  ?

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
  • Zeile B verfügt nicht über ein passendes Release oder einen stärkeren Store, sodass es effektiv y.store(1, std::memory_order_relaxed).
  • Leitung A hat nur eine passende Last, wodurch ihr „Erfassen“-Teil überflüssig wird. Es kann als x.store(1, std::memory_order_release) angezeigt werden.

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!

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