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:
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!