Я использую pthread_create(&thread1, &attrs, //... , //...);
и нуждаюсь, если какое-то условие должно было убить этот поток, как убить это?
Убить нить в библиотеке Pthread
Ответ 1
Сначала сохраните идентификатор потока
pthread_create(&thr, ...)
а затем вызовите
pthread_cancel(thr)
Однако это не рекомендуемая практика программирования! Лучше использовать механизм связи между потоками, такой как семафоры или сообщения, чтобы сообщить потоку, что он должен прекратить выполнение.
Обратите внимание, что pthread_kill (...) фактически не завершает принимающий поток, а вместо этого передает ему сигнал, и это зависит от обработчиков сигналов и сигналов.
Ответ 2
Существует два подхода к этой проблеме.
- Используйте сигнал. Поток устанавливает обработчик сигнала с помощью
sigaction()
, который устанавливает флаг, и поток периодически проверяет флаг, чтобы увидеть, должен ли он завершиться. Когда поток должен завершиться, выдайте ему сигнал с помощьюpthread_kill()
и дождитесь его завершения с помощьюpthread_join()
. Этот подход требует предварительной синхронизации между родительским потоком и дочерним потоком, чтобы гарантировать, что дочерний поток уже установил обработчик сигнала, прежде чем он сможет обрабатывать сигнал завершения; - Используйте точку отмены: поток прекращается всякий раз, когда выполняется функция отмены. Когда поток должен завершиться, выполните
pthread_cancel()
и дождитесь его завершения с помощьюpthread_join()
. Этот подход требует детального использованияpthread_cleanup_push()
иpthread_cleanup_pop()
во избежание утечки ресурсов. Эти последние два вызова могут испортить лексическую область кода (поскольку они могут быть макросами, дающими токены{
и}
), и их очень сложно поддерживать должным образом.
(Обратите внимание: если вы уже отделили поток, используя pthread_detach()
, вы не сможете присоединиться к нему снова, используя pthread_join()
.)
Оба подхода могут быть очень сложными, но могут быть особенно полезны в данной ситуации.
Ответ 3
Я согласен с Antti, лучшей практикой было бы реализовать некоторые контрольные точки, где поток проверяет, должен ли он завершиться. Эти контрольные точки могут быть реализованы несколькими способами, например: разделяемой переменной с блокировкой или событием, которое поток проверяет, установлен ли он (поток может выбрать, чтобы ждать нулевое время).
Ответ 4
Взгляните на функцию pthread_kill()
.
Ответ 5
pthread_exit(0)
Это убьет поток.