Это является продолжением этого вопроса, и я рассмотрел связанные вопросы.
Я все еще пытаюсь выполнить некоторую очистку при получении SIGTERM
, а затем получить эффект TERM
который является поведением по умолчанию, когда нить в процессе не ожидает сигнала, а также никакого обработчика сигналов.
В более раннем вопросе я предположил, что сигналы имеют детерминированное поведение в многопоточном приложении, но после некоторых недетерминированных результатов и некоторых исследований я понял, что это не безопасное предположение.
Мое приложение многопоточно и использование обычного обработчика сигнала через sigaction
или signal
имеет недетерминированные результаты, потому что произвольный выбор того, какой поток фактически прерывается для выполнения обработчика сигнала, имеет значение для операции обработчика сигнала (он очищает некоторые потоки, которые могут затормозить если неправильная цепочка прерывается).
Поэтому я переключился на синхронную обработку сигналов. В частности, я блокирую SIGTERM
используя pthread_sigmask
в начальном потоке, а затем sigwait()
в потоке, который фактически выполняет очистку. Однако после того, как sigwait()
вернется в поток, и я завершу очистку, я затем попробую следующее:
kill(getpid(), SIGTERM);
Однако этот сигнал, очевидно, игнорируется, поскольку все остальные активные потоки блокируют SIGTERM
. Таким образом, мне нужно разблокировать сигналы во всех других потоках, прежде чем вернуться из функции, которую работает мой поток очистки. Есть ли вызов функции, который можно использовать для установки pthread_sigmask
в других потоках?
Там нет ни одного вызова, который может быть использован для установки маски сигнала на других потоках. Полученный сигнал является триггером и не имеет смысла повторно передавать этот сигнал для себя. Вместо этого попробуйте использовать переменные состояния pthreads.