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