Kill Thread в библиотеке Pthread - PullRequest
39 голосов
/ 18 января 2010

Я использую pthread_create(&thread1, &attrs, //... , //...); и мне нужно, если возникло какое-то условие, нужно убить этот поток, как это убить?

Ответы [ 5 ]

55 голосов
/ 18 января 2010

Сначала сохраните идентификатор потока

pthread_create(&thr, ...)

, а затем позвоните

pthread_cancel(thr)

Однако это не рекомендуемая практика программирования!Лучше использовать механизм связи между потоками, например семафоры или сообщения, чтобы сообщить потоку, что он должен остановить выполнение.

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

22 голосов
/ 03 июля 2011

Существует два подхода к этой проблеме.

  • Использовать сигнал : поток устанавливает обработчик сигнала, используя sigaction(), который устанавливает флаг, и поток периодически проверяет флаг, чтобы определить, должен ли он завершиться. Когда поток должен завершиться, подайте ему сигнал с помощью pthread_kill() и дождитесь его завершения с помощью pthread_join(). Этот подход требует предварительной синхронизации между родительским потоком и дочерним потоком, чтобы гарантировать, что дочерний поток уже установил обработчик сигнала, прежде чем он сможет обработать сигнал завершения;
  • Использовать точку отмены : поток завершается всякий раз, когда выполняется функция отмены. Когда поток должен завершиться, выполните pthread_cancel() и дождитесь его завершения с помощью pthread_join(). Этот подход требует подробного использования pthread_cleanup_push() и pthread_cleanup_pop(), чтобы избежать утечки ресурсов. Эти два последних вызова могут нарушать лексическую область кода (поскольку они могут быть макросами, дающими токены { и }), и их очень трудно поддерживать должным образом.

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

Оба подхода могут быть очень хитрыми, но оба могут быть особенно полезны в данной ситуации.

6 голосов
/ 18 января 2010

Я согласен с Antti, лучше бы реализовать некоторые контрольные точки, где поток проверяет, должен ли он завершиться. Эти контрольные точки могут быть реализованы несколькими способами, например: общая переменная с блокировкой или событие, которое поток проверяет, установлено ли оно (поток может выбрать нулевое время ожидания).

2 голосов
/ 18 января 2010

Посмотрите на функцию pthread_kill().

0 голосов
/ 02 февраля 2018
pthread_exit(0) 

Это убьет поток.

...