sig_atomic_t
ist kein atomarer Datentyp. Es ist nur der Datentyp, den Sie im Kontext eines Signalhandlers verwenden dürfen, das ist alles. Lesen Sie den Namen also besser als "atomar relativ zur Signalverarbeitung".
Um die Kommunikation mit und von einem Signalhandler zu gewährleisten, wird nur eine der Eigenschaften atomarer Datentypen benötigt, nämlich die Tatsache, dass read und update immer einen konsistenten Wert sehen. Andere Datentypen (wie etwa long long
) könnte mit mehreren Assembleranweisungen für den unteren und oberen Teil geschrieben werden, z. sig_atomic_t
wird garantiert in einem Rutsch gelesen und geschrieben.
Eine Plattform kann also einen beliebigen Integer-Basistyp als sig_atomic_t
wählen wofür er garantieren kann, dass volatile sig_atomic_t
kann sicher in Signalhandlern verwendet werden. Viele Plattformen wählten int
dafür, weil sie wissen, dass für sie int
wird mit einer einzigen Anweisung geschrieben.
Der neueste C-Standard, C11, hat atomare Typen, die aber etwas völlig anderes sind. Einige von ihnen (diejenigen, die "lockfree" sind) können auch in Signalhandlern verwendet werden, aber das ist wieder eine ganz andere Geschichte.
Beachten Sie, dass sig_atomic_t
ist nicht Thread-sicher, nur Async-Signal-sicher.
Die Atomik beinhaltet zwei Arten von Barrieren:
- Compiler-Barriere. Es stellt sicher, dass der Compiler Lese-/Schreibvorgänge von/in eine atomare Variable relativ zu Lese- und Schreibzugriffen auf andere Variablen nicht neu ordnet. Das ist was
volatile
Schlüsselwort tut. - CPU-Barriere und Sichtbarkeit. Es stellt sicher, dass die CPU Lese- und Schreibvorgänge nicht neu ordnet. Auf x86 sind alle Lade- und Speichervorgänge für ausgerichteten 1,2,4,8-Byte-Speicher atomar. Sichtbarkeit stellt sicher, dass Stores für andere Threads sichtbar werden. Auch hier sind Speicher auf Intel-CPUs aufgrund der Cache-Kohärenz und des Speicherkohärenzprotokolls MESI sofort für andere Threads sichtbar. Aber das kann sich in Zukunft ändern. Siehe §8.1 LOCKED ATOMIC OPERATIONS in Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3A für weitere Details.
Für eine umfassende Behandlung des Themas sehen Sie Atomwaffen:Das C++-Speichermodell und moderne Hardware.