sig_atomic_t
není atomární datový typ. Jde pouze o datový typ, který smíte používat v kontextu obsluhy signálu, to je vše. Takže raději čtěte název jako "atomový vzhledem ke zpracování signálu".
Pro zaručení komunikace s a ze signálového handleru je potřeba pouze jedna z vlastností atomických datových typů, a to skutečnost, že čtení a aktualizace budou vždy vidět konzistentní hodnotu. Jiné datové typy (například long long
) lze napsat s několika instrukcemi assembleru pro nižší a vyšší část, např. sig_atomic_t
je zaručeno, že se přečte a zapíše jedním tahem.
Platforma si tedy může vybrat jakýkoli základní typ celého čísla jako sig_atomic_t
za což může poskytnout záruku, že volatile sig_atomic_t
lze bezpečně použít v obslužných zařízeních signálů. Mnoho platforem zvolilo int
za to, protože vědí, že pro ně je int
je zapsána jedinou instrukcí.
Nejnovější standard C, C11, má atomové typy, které jsou ale úplně něco jiného. Některé z nich (ty, které jsou "bez zámku") lze také použít v obslužných programech signálů, ale to je opět úplně jiný příběh.
Všimněte si, že sig_atomic_t
není bezpečný pro vlákna, pouze bezpečný pro asynchronní signál.
Atomy zahrnují dva typy bariér:
- Překážka kompilátoru. Zajišťuje, že kompilátor nezmění pořadí čtení/zápisu z/do atomové proměnné vzhledem ke čtení a zápisu do jiných proměnných. To je to, co
volatile
klíčové slovo ano. - Biéra a viditelnost CPU. Zajišťuje, že CPU nemění pořadí čtení a zápisu. Na x86 jsou všechna zatížení a ukládání do zarovnaného 1,2,4,8bajtového úložiště atomická. Viditelnost zajišťuje, že obchody budou viditelné pro ostatní vlákna. Opět platí, že na procesorech Intel jsou obchody okamžitě viditelné pro ostatní vlákna díky koherenci mezipaměti a koherenci paměti protokolu MESI. To se ale může v budoucnu změnit. Další podrobnosti najdete v §8.1 LOCKED ATOMIC OPERATIONS v Intel® 64 a IA-32 Architectures Software Developer’s Manual Volume 3A.
Pro komplexní zpracování předmětu hodinky atomové zbraně:model paměti C++ a moderní hardware.