Прерывание двух блокирующих pthreads сигналами

В моем приложении главный поток создает два объединенных потока; один, который ожидает ввода данных пользователем, вызывая в цикле scanf(), и другой, который прослушивает входящие сокетные соединения, вызывая в цикле accept(). Новые соединения обрабатываются в отдельных потоках, которые отделяются.

Я хочу, чтобы программа изящно завершала свою работу при получении сигнала SIGINT. Это означает, что прослушивающий поток должен прекратить принимать новые соединения, дождаться закрытия потоков, обслуживающих соединения в данный момент, и затем завершить работу. Поток, ожидающий пользовательского ввода, также должен завершиться и тем самым позволить завершиться главному потоку.

Scanf() и accept() оба блокируют, но могут быть прерваны сигналом, однако сигналы, посылаемые процессу, могут обрабатываться только одним потоком (AFAIK). Моя идея состоит в том, чтобы блокировать сигналы SIGINT во всех потоках, кроме главного потока, который будет их ждать. Когда он получит SIGINT, он пошлет SIGUSR1 двум потокам (одному, который блокирует scanf(), и другому, который блокирует accept()), а затем присоединится к этим потокам.

Хорошее ли это решение? Есть ли лучший или, возможно, стандартный способ добиться этого?

5
задан SlappyTheFish 29 January 2012 в 20:00
поделиться