2014-04-08 5 views
0

Почему эта нить продолжает выполнение, хотя я ее убиваю ???POSIX - pthread_kill()?

pthread_t pid; 
pthread_create(&pid, NULL, (func)countdown, NULL); 
pthread_kill(pid, 1); 
pthread_join(pid, NULL); 

ответ

1

pthread_kill - это функция отправки сигналов в поток. Вы в настоящее время посылаете ему сигнал 1, который является SIGHUP. Стандартными сигналами для запроса или принуждения являются SIGTERM и SIGKILL, которые являются 15 и 9 соответственно.

Кроме того, вы должны использовать константы, а не магические числа для отправки сигналов. Они определены в signal.h. signal documentation предоставит вам более подробную информацию.

Обновление: Комментарий от nos, правильный способ прекращения потоков (а не всего приложения) заключается в использовании pthread_cancel. Использование описанного выше pthread_kill будет иметь тенденцию убивать весь процесс, если принимающий поток не регистрирует обработчик сигнала.

+2

Способ прекращения потоков с помощью pthread_cancel, а не pthread_kill (но даже это требует большой осторожности). С pthread_kill, если действие завершается, весь процесс завершается, а не только поток. – nos

+0

@ nos, Спасибо за исправление. Я уточню свой ответ. – merlin2011

+3

Да, 'pthread_cancel' является« правильным »способом отменить поток POSIX, но я бы сказал, что« правильный »способ« отменить »поток имеет условный объект какого-либо типа (либо тип« pthread_cond » или просто простой 'bool' или' int'), который проверяется в потоке ... отмена потока (в POISX или Windows) может иметь возможные негативные последствия для вашего приложения, а также привести к возможным проблемам с повреждением стека (хотя вы может быть повезло большую часть времени, а не «видеть» эти ошибки). – txtechhelp

Смежные вопросы