Подтвердить что ты не робот

Убить нить в библиотеке Pthread

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

4b9b3361

Ответ 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) 

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