Я чрезмерно проектирую блокировку сигнала для каждого потока?

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

Чтобы рабочие потоки не «крали» сигналы, я делаю это в точке входа для каждого:

// Block signals in this thread
sigset_t signal_set;
sigaddset(&signal_set, SIGINT);
sigaddset(&signal_set, SIGTERM);
sigaddset(&signal_set, SIGHUP);
sigaddset(&signal_set, SIGPIPE);
pthread_sigmask(SIG_BLOCK, &signal_set, NULL);

Если я не, когда я выполняю Ctrl+С, Некоторое время (неизвестно, какой поток получит сигнал), мои обработчики в базовом потоке не будут вызываться — вместо этого сигнал просто завершает процесс из рабочего потока. Это явно не круто.

Таким образом, у меня есть один поток обработки сигналов и блокировка сигналов везде.

Тем не менее, я не замечаю, чтобы кто-то еще делал это, это достаточно легко забыть сделать, и при этом оно не совсем переносимо. Есть ли еще один простой трюк, который я пропускаю?


Рекомендации:

8

Решение

Я считаю, что это совершенно разумно.

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

Или вы можете оставить сигналы заблокированными везде и явно обрабатывать их через sigwait и друзья в ветке обработки сигналов.

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector