Почему эта нить продолжает выполнение, хотя я ее убиваю ???POSIX - pthread_kill()?
pthread_t pid;
pthread_create(&pid, NULL, (func)countdown, NULL);
pthread_kill(pid, 1);
pthread_join(pid, NULL);
Почему эта нить продолжает выполнение, хотя я ее убиваю ???POSIX - pthread_kill()?
pthread_t pid;
pthread_create(&pid, NULL, (func)countdown, NULL);
pthread_kill(pid, 1);
pthread_join(pid, NULL);
pthread_kill
- это функция отправки сигналов в поток. Вы в настоящее время посылаете ему сигнал 1
, который является SIGHUP
. Стандартными сигналами для запроса или принуждения являются SIGTERM
и SIGKILL
, которые являются 15
и 9
соответственно.
Кроме того, вы должны использовать константы, а не магические числа для отправки сигналов. Они определены в signal.h
. signal documentation предоставит вам более подробную информацию.
Обновление: Комментарий от nos, правильный способ прекращения потоков (а не всего приложения) заключается в использовании pthread_cancel
. Использование описанного выше pthread_kill
будет иметь тенденцию убивать весь процесс, если принимающий поток не регистрирует обработчик сигнала.
Способ прекращения потоков с помощью pthread_cancel, а не pthread_kill (но даже это требует большой осторожности). С pthread_kill, если действие завершается, весь процесс завершается, а не только поток. – nos
@ nos, Спасибо за исправление. Я уточню свой ответ. – merlin2011
Да, 'pthread_cancel' является« правильным »способом отменить поток POSIX, но я бы сказал, что« правильный »способ« отменить »поток имеет условный объект какого-либо типа (либо тип« pthread_cond » или просто простой 'bool' или' int'), который проверяется в потоке ... отмена потока (в POISX или Windows) может иметь возможные негативные последствия для вашего приложения, а также привести к возможным проблемам с повреждением стека (хотя вы может быть повезло большую часть времени, а не «видеть» эти ошибки). – txtechhelp