Можно ли установить pthread_sigmask во всех потоках процесса?

0

Это является продолжением этого вопроса, и я рассмотрел связанные вопросы.

Я все еще пытаюсь выполнить некоторую очистку при получении SIGTERM, а затем получить эффект TERM который является поведением по умолчанию, когда нить в процессе не ожидает сигнала, а также никакого обработчика сигналов.

В более раннем вопросе я предположил, что сигналы имеют детерминированное поведение в многопоточном приложении, но после некоторых недетерминированных результатов и некоторых исследований я понял, что это не безопасное предположение.

Мое приложение многопоточно и использование обычного обработчика сигнала через sigaction или signal имеет недетерминированные результаты, потому что произвольный выбор того, какой поток фактически прерывается для выполнения обработчика сигнала, имеет значение для операции обработчика сигнала (он очищает некоторые потоки, которые могут затормозить если неправильная цепочка прерывается).

Поэтому я переключился на синхронную обработку сигналов. В частности, я блокирую SIGTERM используя pthread_sigmask в начальном потоке, а затем sigwait() в потоке, который фактически выполняет очистку. Однако после того, как sigwait() вернется в поток, и я завершу очистку, я затем попробую следующее:

kill(getpid(), SIGTERM);

Однако этот сигнал, очевидно, игнорируется, поскольку все остальные активные потоки блокируют SIGTERM. Таким образом, мне нужно разблокировать сигналы во всех других потоках, прежде чем вернуться из функции, которую работает мой поток очистки. Есть ли вызов функции, который можно использовать для установки pthread_sigmask в других потоках?

  • 0
    Зачем тебе это нужно? Разве вы не можете просто разблокировать его в ветке sigwait, когда закончите делать свое дело и перед тем, как отправлять SIGTERM себе?
  • 0
    Если бы я это сделал, мне нужно было бы продолжать работу этого потока даже после того, как он уже выполнил свою задачу, не так ли?
Показать ещё 5 комментариев
Теги:
multithreading
signals
pthreads

1 ответ

0

Там нет ни одного вызова, который может быть использован для установки маски сигнала на других потоках. Полученный сигнал является триггером и не имеет смысла повторно передавать этот сигнал для себя. Вместо этого попробуйте использовать переменные состояния pthreads.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню