обработчик сигнала в потоке - PullRequest
1 голос
/ 19 мая 2011

Я пишу многопоточную программу, и у меня есть такой вопрос: предположим, что при выполнении в основном потоке я хочу завершить все дочерние потоки.Я не могу просто отправить им сигнал завершения, потому что я хочу, чтобы они сначала освободили динамически выделенную память.Могу ли я определить определенную функцию обработчика сигнала в каждой выполняемой функции потока, которая в свою очередь вызовет функцию очистки, которую я напишу для этого?Если нет, то как мне достичь своей цели?

Спасибо, Никос

Ответы [ 3 ]

4 голосов
/ 19 мая 2011

Посмотрите на справочную страницу для pthread_cancel:

Когда выполняется запрошенное аннулирование, для потока выполняются следующие шаги (в этом порядке):

   1. Cancellation clean-up handlers are popped (in the reverse of the order in
      which they were pushed) and called.  (See pthread_cleanup_push(3).)

   2. Thread-specific data destructors are called, in an unspecified order.  (See
      pthread_key_create(3).)

   3. The thread is terminated.  (See pthread_exit(3).)

Таким образом, вы можете использовать pthread_cancel со своего основного устройства, при условии, что вы правильно зарегистрировали обработчики очистки, используя вышеуказанные функции.содержит много важной информации.)

Редактировать : (из комментариев) Если вы планируете использовать PTHREAD_CANCEL_DEFERRED и вам нужно вставить точку отмены где-нибудь в вашем коде, тогда используйте pthread_testcancel.Эта функция проверяет, была ли отменена заявка.Если это так, отмена обслуживается (т. Е. Этот вызов никогда не возвращается).В противном случае это не имеет никакого эффекта.

1 голос
/ 19 мая 2011

Самая надежная стратегия требует взаимодействия с дочерними потоками: вы устанавливаете флаг, который потоки периодически проверяют, и, когда флаг установлен, освобождают все ресурсы, которые они используют, а затем завершают работу.

0 голосов
/ 19 мая 2011

Отмена (ответ Мэта) является правильной и канонической, но если вы хотите использовать другой подход, вы можете установить обработчик сигнала без операции, используя sigaction без флага SA_RESTART и использовать pthread_kill с любым сигналом номер, который вы выбрали для прерывания (EINTR) независимо от того, на чем поток может быть заблокирован. В сочетании с этим, ответ Экс работает.

...