1

В Unix, когда сигналы публикуются, а процесс приема запускает более одного потока, сначала выбирается поток для выполнения процедуры обработки сигналов.

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

1 ответ1

3

Конечно, ему нужен собственный стек и набор регистров. Но в каком контексте потока он работает, тоже имеет значение. С одной стороны, это контролирует, какая работа прерывается во время обработки сигнала.

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

Теперь, скажем, сигнал прерывает поток А, и обработчик сигнала отправляется на захват блокировки, чтобы проверить эту критическую структуру. Он получает блокировку, потому что это поток, который уже содержит блокировку, а блокировка рекурсивная. Поскольку он только что получил блокировку, которая защищает критическую структуру, он ожидает, что сможет получить к ней доступ и найти ее в согласованном состоянии. Но, конечно, это в противоречивом состоянии. Boom! Вы только что разбились.

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .