«Это говорит»?Что говорит?Домашнее задание?
Первое, что вы должны понять о программировании с потоками и сигналами, это то, что у вас очень мало контроля над тем, в какой поток доставляется сигнал.Если ваш основной поток хочет получить сигнал, он должен заблокировать сигнал перед созданием любых новых потоков и, возможно, разблокировать его после завершения их создания, чтобы гарантировать, что сигнал не будет доставлен им.
Однако , если вы следуете рекомендациям для обработчиков сигналов, вероятно, не имеет значения, какой поток обрабатывает сигнал.Все, что нужно сделать обработчику сигнала, это установить глобальный флаг или записать байт в канал (в зависимости от того, что лучше всего работает, чтобы основной поток заметил, что сигнал произошел. (Обратите внимание, что вы не можете использовать переменные условия или любые другиеблокировка примитивов из обработчиков сигналов!) Как и в фрагменте кода в вашем вопросе, блокировка сигнала и использование sigwait
также возможны (опять же, имейте в виду, что его нужно заблокировать в всех потоках),но большинство программ не могут позволить себе останавливаться и ждать только сигналов, им также нужно ждать условных переменных и / или ввода из файлов. Один из способов решения этой проблемы - создать выделенный поток для вызова sigwait
, ноэто довольно расточительно. Лучшее решение, если вы уже используете select
, это переключиться на pselect
, который может ожидать сигналы, а также события дескриптора файла (в то же время).
Вместо того, чтобы спрашивать нас об ответах (которые в любом случае было бы трудно дать, не видя полной программы, с которой вы пытаетесь работать), yлучше бы тебе было по-настоящему понять тонкости сигналов с потоками.