Я использую pthread_create(&thread1, &attrs, //... , //...);
и вам нужно, если возникло какое-то условие, нужно убить эту тему, как убить это?Убить нить в библиотеке Pthread
ответ
Первый магазин идентификатор потока
pthread_create(&thr, ...)
потом называют
pthread_cancel(thr)
Однако это не рекомендуется практика программирования! Лучше использовать механизм связи между потоками, такой как семафоры или сообщения, для связи с потоком, чтобы он прекратил выполнение.
Обратите внимание, что pthread_kill (...) фактически не прекращает приемный поток, а вместо этого передает ему сигнал, и это зависит от сигналов и обработчиков сигналов, что происходит.
Я согласен с Antti, лучшей практикой было бы реализовать некоторые контрольные точки, где поток проверяет, должен ли он завершиться. Эти контрольные точки могут быть реализованы несколькими способами, например: разделяемой переменной с блокировкой или событием, которое поток проверяет, установлен ли он (поток может выбрать нулевое время).
Существует два подхода к этой проблеме.
- Используйте сигнал: Поток устанавливает обработчик сигнала с помощью
sigaction()
, который устанавливает флаг, и поток периодически проверяет флаг, чтобы увидеть, должен ли он прекратить. Когда поток должен завершиться, выдайте ему сигнал с помощьюpthread_kill()
и дождитесь его завершения с помощьюpthread_join()
. Этот подход требует предварительной синхронизации между родительским потоком и дочерним потоком, чтобы гарантировать, что дочерний поток уже установил обработчик сигнала, прежде чем он сможет обрабатывать сигнал завершения; - Используйте пункт отмены: Нить прекращается всякий раз, когда выполняется функция отмены. Когда поток должен завершиться, выполните
pthread_cancel()
и дождитесь его завершения с помощьюpthread_join()
. Этот подход требует детального использованияpthread_cleanup_push()
иpthread_cleanup_pop()
во избежание утечки ресурсов. Эти последние два вызова могут испортить лексическую область кода (поскольку они могут быть макросами, дающими{
и}
токенами), и их очень сложно поддерживать должным образом.
(Обратите внимание, что если вы уже отсоединили нить с помощью pthread_detach()
, вы не можете присоединиться к нему еще раз, используя pthread_join()
.)
Оба подхода может быть очень сложно, но как может быть особенно полезно в данной ситуации.
pthread_exit(0)
Это убьет нить.
- 1. Как прервать спящую нить в pthread?
- 2. Как убить pthread в ANSI C
- 3. вручную убить яваскрипту нить
- 4. как убить заблокированную нить
- 5. как убить нить качанием?
- 6. Python: Убить нить
- 7. Как убить нить java?
- 8. Убить подвешенную нить
- 9. Альтернативный способ убить нить
- 10. Как убить основную нить?
- 11. Как убить нить в delphi?
- 12. Как убить нить в сервисе?
- 13. Как убить нить в андроиде?
- 14. Как убить нить в C#?
- 15. В качели можно убить нить?
- 16. Убить нить в PropertyListener (JavaFX8)
- 17. Проверьте, заблокирована ли нить pthread
- 18. Как остановить запущенную нить pthread?
- 19. Убить нить из другого процесса
- 20. убить отдельную нить, имеющую розетку
- 21. Убить нить на диалоге Закрыть
- 22. Убить многопоточную нить сервера C#
- 23. ищет способ остановить/убить нить
- 24. Bordeaux-Threads: как убить нить?
- 25. Perl нити убить таймаута нить
- 26. Отсутствие символов отладки в библиотеке pthread
- 27. Как убить витую нить в java
- 28. Как остановить или убить нить в java?
- 29. убить другую нить в моем случае
- 30. Как убить нить красивой в java?
Проблема с pthread_cancel, btw, заключается в том, что если вы ее используете, тогда код, выполняющийся в отключенном потоке, должен понимать точки отмены и следить за тем, чтобы (a) он ударил достаточно часто, чтобы он фактически был отменен в хорошем состоянии и (б) он не утечка ресурсов, когда это произойдет. Это довольно сложно, в то время как если вы используете сообщение, тогда он четко отображается в вашем коде точно, когда поток может выйти. –
@Steve: К сожалению, 'pthread_cancel' является единственным чистым способом * в библиотечном коде *, чтобы прервать поток, который может быть заблокирован в syscall. Другой метод заключается в установке прерывания обработчика сигнала и убедитесь, что весь ваш код готов к работе с 'EINTR', но библиотечный код не может считать, что он имеет право изменять обработку сигнала или накладывать обработку« EINTR »на вызывающего. –