В каких ситуациях обработчик сигнала может быть выполнен в неосновном потоке? - PullRequest
0 голосов
/ 13 марта 2020

У меня вопрос только о том, что написано в заголовке (только для Unix / Linux). Я предполагаю, что пользовательские вызовы std::raise и std::abort всегда выполняются в том же потоке, в котором был выполнен вызов, но у меня есть несколько вопросов об асинхронных процедурах и процедурах ядра, отправляющих сигналы ...

  • Если я отправлю сигнал из командной строки в pid потока, обработает ли поток сигнал или он будет обработан основным потоком в зависимости от того, какой сигнал был отправлен?
  • Если malloc обнаружит некоторое повреждение кучи Будет ли сигнал отправлен в основной поток или будет также выполнен в потоке, который вызвал malloc? Те же вопросы относятся к ошибкам, генерирующим SIGFPE или SIGSEGV.
  • Существуют сигналы, которые всегда обрабатываются основным потоком, независимо от того, к какому потоку это относится или на какой pid был отправлен?
  • Какие другие ситуации стоит упомянуть в многопоточных контекстах?

1 Ответ

2 голосов
/ 14 марта 2020

Нить main() не является особенной. Он принимает сигналы, как и любой другой поток.

Когда сигнал генерируется «асинхронно» для процесса или группы процессов (например, с помощью kill или Ctrl- C на терминале), реализация может выберите любой поток для доставки.

Поток, выполняющий main(), ничем не отличается от любого другого потока в процессе. Если вы хотите контролировать, какой поток получает сигнал, вы должны заблокировать доставку сигнала во всех потоках, кроме одного, или заблокировать и вызвать sigwait из нужного потока.

Когда сигнал генерируется «синхронно» в пределах поток (как raise, abort, ошибка сегментации и т. д. c.) или нацелен на указанный поток c (как pthread_kill), тогда этот поток и только этот поток будет получить сигнал. Если этот поток блокирует сигнал, то сигнал удерживается в ожидании до тех пор, пока не будет разблокирован или принят.

Здесь два очень хороших источника - это всеобъемлющая, но сравнительно плотная POSIX обработка и приятно доступная GNU lib c обработка из UNIX сигналов. Однако оба ориентированы на C, а не на C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...