Я пишу программу с главным потоком и несколькими рабочими потоками, и я хотел бы получить правильную обработку сигнала. Моя проблема заключается в следующем:
Главный поток запускается и выполняет все распределение
Главный поток устанавливает обработчик сигнала SIGINT
Основные потоки запускают рабочие потоки. рабочие потоки не нуждаются в специальной очистке, однако они могут находиться в спящем режиме при системном вызове или семафоре.
Когда SIGINT получен, я понимаю, что только один поток получает его. Так что, если поток спит по системному вызову или семафору, они не проснутся, и я не смогу
pthread_join в моих рабочих потоках и выполните всю необходимую очистку в моем основном потоке.
Может ли следующий обработчик сигнала решить мою проблему?
void term(int sig)
{
g_do_cleanup = 1;
pthread_kill(worker_1_id, some_other_signal);
...
pthread_kill(worker_2_id, some_other_signal);
}
Я ожидаю, что после получения SIGINT все потоки будут оповещены другим сигналом, выйдут из своего блокирующего вызова, увидят флаг g_do_cleanup
и изящно выйдут.
Любые комментарии или ссылки о том, как это сделать правильно, приветствуются.
Редактировать:
Я НЕ ищу способ пробуждения многопотокового ожидания в определенном состоянии, поэтому я не думаю, что подход pthread_cond_signal - это то, что я ищу. То, что я хочу, это:
- Найдите способ, которым все темы, которые
заблокирован на блокирующем вызове возвращается
от этих звонков.
- Или убить все темы, кроме основной.