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. Лучше было бы реализовать некоторые контрольные точки, где поток проверяет, должен ли он завершиться. Эти контрольные точки могут быть реализованы несколькими способами, например: общая переменная с блокировкой или событие, которое поток проверяет, установлено ли оно (поток может выбрать нулевое время ожидания).

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

pthread_exit(0) 

Это убьет нить.

Другие вопросы по тегам