Heim >Backend-Entwicklung >C++ >Garantieren C/C-Standards atomare Operationen für jeden Datentyp auf ARM- und x86-64-Architekturen?

Garantieren C/C-Standards atomare Operationen für jeden Datentyp auf ARM- und x86-64-Architekturen?

DDD
DDDOriginal
2024-12-15 14:29:31445Durchsuche

Do C/C   Standards Guarantee Atomic Operations for Any Data Type on ARM and x86-64 Architectures?

ARM und x86-64: Keine garantierten Atomtypen

Entgegen der ursprünglichen Annahme bieten die C/C-Sprachstandards keine Garantien für Atomare Operationen für jeden spezifischen Datentyp, auch auf 64-Bit-Computern.

Atomic Access via Signale vs. Threads

Es ist wichtig, zwischen zwei Konzepten der Atomizität zu unterscheiden:

  • Atomizität in Bezug auf Signale: Gewährleistet die Signalsicherheit und ermöglicht eine korrekte Liest den aktualisierten Wert nach einer Signalunterbrechung innerhalb desselben Threads.
  • Atomar in Bezug auf Threads: Stellt die Konsistenz der Daten über mehrere Threads hinweg sicher und verhindert Beschädigungen bei gleichzeitigem Zugriff.

GCC-Implementierungen auf ARM und x86-64

Während modern CPUs wie ARMv8 und x86-64 garantieren möglicherweise atomaren Zugriff für bestimmte Vorgänge. Diese Garantien werden nicht auf Sprachebene widergespiegelt. GCC und andere Compiler können Code auf eine Weise optimieren, die diese Atomizitäten auf Hardwareebene verletzt, wie das folgende Beispiel zeigt:

volatile uint32_t x;

uint32_t foo(void) {
    return (x >> 8) & 0xffff;
}

Obwohl x eine 32-Bit-Variable ist, kompiliert GCC foo als zwei separate 16 -Bit-Ladungen, die zu einem nicht-atomaren Lesevorgang führen können, wenn x gleichzeitig geändert wird.

Vertrauen auf std::atomic oder _Atomic

Die einzige Möglichkeit, atomare Operationen in C und C sicherzustellen, besteht darin, explizit die Typen std::atomic (C) oder _Atomic (C) zu verwenden, die für die notwendige Synchronisierung sorgen Mechanismen zur Gewährleistung eines threadsicheren Zugriffs.

Das obige ist der detaillierte Inhalt vonGarantieren C/C-Standards atomare Operationen für jeden Datentyp auf ARM- und x86-64-Architekturen?. 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