Je to stará otázka, ale přesto.
Vlákna POSIX na Linuxu v glibc (NPTL) jsou implementována pomocí dvou signálů v reálném čase. Jsou před uživatelem skryty (nastavením min/max číselných konstant). Všechny události, kde volání knihovny musí být šířeno do všech vláken (jako setuid
) se provádějí prostřednictvím těchto:volající vlákno pošle signál všem vláknům, aby aplikovaly změnu, čeká na potvrzení a pokračuje.
Asynchronní I/O.
Signály v reálném čase jsou mechanismem, kterým jádro informuje váš systém o dokončení I/O operace.
struct aiocb
vytvoří spojení mezi asynchronním I/O požadavkem a číslem signálu.
Nejprve si všimněte, že Benova odpověď je správná. Pokud mohu říci, celý účel signálů v reálném čase v POSIX je jako mechanismus doručování v reálném čase pro AIO, upozornění na frontu zpráv, vypršení platnosti časovače a signály definované aplikací (jak interní, tak meziprocesové).
Díky tomu jsou signály obecně opravdu špatným způsobem, jak dělat věci:
- Obslužné rutiny signálů jsou asynchronní, a pokud nezajistíte, že nepřeruší funkci async-signal-unsafe, mohou používat pouze funkce async-signal-safe, což značně omezuje jejich možnosti.
- Obsluhy signálů jsou globálním stavem. Knihovna nemůže používat signály bez smlouvy s volajícím programem ohledně toho, které signály smí používat, zda je smí přerušit systémové volání atd. A obecně platí, že globální stav je jen Špatná věc .
- Pokud používáte
sigwait
(nebo Linuxsignalfd
rozšíření) spíše než manipulátory signálů pro zpracování signálů, nejsou o nic lepší než jiné mechanismy IPC/oznámení a stále jsou potenciálně horší.
Asynchronní IO se mnohem lépe dosahuje ignorováním špatně navrženého POSIX AIO API a pouhým vytvořením vlákna pro provádění normálního blokování IO a volání pthread_cond_signal
nebo sem_post
až operace skončí. Nebo, pokud si můžete dovolit trochu výkonových nákladů, můžete si právě načtená data přeposlat zpět přes rouru nebo pár zásuvek a nechat hlavní vlákno zpracovat asynchronně – číst běžné soubory s select
nebo poll
stejně jako byste to dělali sockets/pipes/ttys.