pthread_kill не убивает поток C Linux - PullRequest
1 голос
/ 19 февраля 2012

Я делаю небольшой проект, который будет включен в более крупный проект. По сути, он отслеживает потоки, которые создаются путем добавления их в основную структуру, которая отслеживает, что делает поток (его основная функция) и его идентификатор pthread_t. другая структура отслеживает данные, которые будут переданы функции, и номер элемента, в котором хранится идентификатор pthread_t внутри потоков []. Это немного странная мышь, и она немного прыгает, но все это работает, кроме того, когда приходит время убить поток. я не получаю segfaults и никаких ошибок, и программа завершается нормально, но поток не убивается при вызове pthread_kill () (функция возвращает 0, что означает отсутствие ошибки, и она работала), хотя поток продолжает работать до тех пор, пока не вернется основное приложение.

Ответы [ 2 ]

5 голосов
/ 19 февраля 2012

pthread_kill() не убьет поток.Единственная разница с kill() состоит в том, что сигнал обрабатывается назначенным потоком и не обрабатывается, пока этот поток имеет маскированный сигнал (см. pthread_sigmask()).Сигнал наподобие SIGTERM по умолчанию все равно завершит весь процесс.

Если вы планируете вызвать pthread_exit() из обработчика сигнала, вам, вероятно, следует использовать pthread_cancel().

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

Более безопасный метод - попросить поток выйти без каких-либо усилий, например, отправив ему специальное сообщение (если поток обычно обрабатывает сообщения).

В качестве альтернативы, не пытайтесь уничтожить какие-либо потоки, просто вызовите _exit(), _Exit() или quick_exit().

4 голосов
/ 19 февраля 2012

С http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_kill.html

Как и в kill (), если sig равен нулю, выполняется проверка ошибок, но на самом деле сигнал не отправляется.

поэтому следующее

pthread_kill (threads [i] .tID, 0);

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

http://pubs.opengroup.org/onlinepubs/7908799/xsh/signal.h.html

...