В книге интерфейса программирования Linux упоминался метод работы с асинхронными сигналами в многопоточной программе:
- Все потоки блокируют все асинхронные сигналы, что процесс может получить. Самый простой способ сделать это блокирование сигналов в основная нить перед любой другой нитью создаются. Каждый впоследствии созданный нить наследует копию основного нить.
- создать отдельный выделенный поток, который принимает входящие сигналы, используя
sigwaitinfo()
,sigtimedwait()
илиsigwait()
.Преимущество такого подхода заключается в том, что асинхронно генерируемые сигналы полученных синхронно. Поскольку он принимает входящие сигналы, выделенный поток могут безопасно изменять общие переменные (под управлением мьютекса) и вызова неасинхронные функции. Он также может переменные условия сигнала и использовать другая связь потоков и процессов и механизмы синхронизации.
Теперь вопросы:
- Когда ядро хочет доставлять сигналы, он выбирает один из потоков внутри процесса произвольным. откуда он может знать, передать сигнал в выделенный поток?
- API pthread - это несинхронные функции. так как мы можем использовать их внутри обработчика сигнала?