sig_atomic_t
non è un tipo di dati atomico. È solo il tipo di dati che puoi utilizzare nel contesto di un gestore di segnale, tutto qui. Quindi meglio leggere il nome come "atomico relativo alla gestione del segnale".
Per garantire la comunicazione con e da un gestore di segnale, è necessaria solo una delle proprietà dei tipi di dati atomici, ovvero il fatto che read e update vedranno sempre un valore consistente. Altri tipi di dati (come forse long long
) potrebbe essere scritto con diverse istruzioni assembler per la parte inferiore e superiore, ad es. sig_atomic_t
è garantito per essere letto e scritto in una volta sola.
Quindi una piattaforma può scegliere qualsiasi tipo di base intero come sig_atomic_t
per cui può fare la garanzia che volatile sig_atomic_t
può essere tranquillamente utilizzato nei gestori di segnali. Molte piattaforme hanno scelto int
per questo, perché sanno che per loro int
è scritto con una singola istruzione.
L'ultimo standard C, C11, ha tipi atomici, ma che sono una cosa completamente diversa. Alcuni di essi (quelli "senza blocco") possono essere utilizzati anche nei gestori di segnale, ma anche questa è una storia completamente diversa.
Nota che sig_atomic_t
non è thread-safe, solo segnale asincrono sicuro.
Gli atomi implicano due tipi di barriere:
- Barra del compilatore. Si assicura che il compilatore non riordini le letture/scritture da/a una variabile atomica rispetto alle letture e scritture su altre variabili. Questo è ciò che
volatile
la parola chiave fa. - Barriera e visibilità della CPU. Si assicura che la CPU non riordini letture e scritture. Su x86 tutti i caricamenti e gli archivi nell'archiviazione allineata a 1,2,4,8 byte sono atomici. La visibilità fa in modo che i negozi diventino visibili ad altri thread. Ancora una volta, sulle CPU Intel, gli archivi sono immediatamente visibili ad altri thread grazie alla coerenza della cache e al protocollo di coerenza della memoria MESI. Ma questo potrebbe cambiare in futuro. Vedere §8.1 OPERAZIONI ATOMICHE BLOCCATE in Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 3A per maggiori dettagli.
Per una trattazione completa dell'argomento guarda Atomic Weapons:The C++ Memory Model and Modern Hardware.