Я использую 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)
Это убьет поток.