Ответ 1
Повторный вход и безопасность потока имеют немного или ничего общего с этим. Побочные эффекты, состояние и прерывание этих функций - это факты, которые имеют значение.
асинхронно-безопасная функция [GNU Pth]
Функция асинхронна, или безопасным асинхронным сигналом, если его можно назвать безопасным и без побочные эффекты из контекста обработчика сигналов. То есть, это должно быть может быть прервана в любой точке для линейного выхода из последовательности без возникновения несогласованного состояния. Он должен также функционировать должным образом когда глобальные данные могут сами быть в противоречивом состоянии. Некоторые асинхронно-безопасные операции перечислены здесь:
- вызов функции
signal()
для переустановки обработчика сигнала- безоговорочно изменить переменную
volatile sig_atomic_t
(as модификация этого типа является атомной)- вызов функции
_Exit()
для немедленно прекратить выполнение программы- вызывать асинхронный функции, как указано в вашей реализации
Несколько функций портативно асинхронно-безопасный. Если функция выполняет любые другие функции операций, он, вероятно, не является асинхронно безопасным.
Эмпирическое правило - это только сигнал некоторой переменной условия из обработчика сигнала (например, условие futex/pthread, цикл epoll для пробуждения и т.д.).
UPDATE:
Как сказал посол в России, даже вызов pthread_cond_signal
- плохая идея. Я проверил исходный код недавнего eglibc
, и там есть пара блокировки/разблокировки. Таким образом, введение возможности для тупика. Это оставляет нам несколько опций для сигнализации других потоков:
- Используя
eventfd
. - Изменение глобальной атомной переменной и надеемся, что SA_RESTART не установлен, а другие потоки будут проверять наш атом.