Heim > Backend-Entwicklung > C++ > Wie wirken sich interne Neuordnungen in C-Atomic-Read-Modify-Write-Vorgängen auf die Speicherordnung aus?

Wie wirken sich interne Neuordnungen in C-Atomic-Read-Modify-Write-Vorgängen auf die Speicherordnung aus?

Barbara Streisand
Freigeben: 2024-12-09 19:59:12
Original
472 Leute haben es durchsucht

How Do Internal Reorderings in C   Atomic Read-Modify-Write Operations Affect Memory Ordering?

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;
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage