我用pthread_create(&thread1, &attrs, //... , //...);
並需要如果發生某種情況需要殺死這個線程如何殺死這個?殺死線程在pthread庫
35
A
回答
50
第一家門店線程ID
pthread_create(&thr, ...)
然後再打
pthread_cancel(thr)
然而,這不是建議的編程習慣!最好使用線程間通信機制(如信號量或消息)來與線程通信以停止執行。
請注意,pthread_kill(...)並不實際終止接收線程,而是向它發送一個信號,它取決於信號和信號處理程序會發生什麼。
2
5
我同意Antti,更好的做法是實現一些檢查點,在線程檢查它是否應該終止。這些檢查點可以通過多種方式實現,例如:帶鎖的共享變量或線程檢查是否設置的事件(線程可以選擇等待零時間)。
18
有兩種解決這個問題的方法。
- 使用信號:螺紋安裝使用
sigaction()
信號處理程序來設置一個標誌,而線程定期檢查標誌,看其是否必須終止。當線程必須終止時,使用pthread_kill()
向它發出信號並等待終止,使用pthread_join()
。此方法需要父線程和子線程之間的預同步,以確保子線程在能夠處理終止信號之前已經安裝了信號處理程序; - 使用取消點:線程在執行取消功能時終止。當線程必須終止時,執行
pthread_cancel()
並等待其終止時使用pthread_join()
。此方法需要詳細使用pthread_cleanup_push()
和pthread_cleanup_pop()
以避免資源泄漏。最後兩次調用可能會混淆代碼的詞彙範圍(因爲它們可能是宏,產生{
和}
令牌),並且很難正確維護。
(請注意,如果你已經脫離使用pthread_detach()
線程,則不能再次使用pthread_join()
加入。)
這兩種方法都可以很棘手,但無論哪種可能是在特定情況下特別有用。
0
pthread_exit(0)
這會殺死線程。
相關問題
- 1. 在C中殺死一個pthread而不殺死整個進程
- 2. 對於pthread,如何從主線程中殺死子線程
- 3. Android:殺死線程
- 4. 殺死ASP.NET線程
- 5. 在Python中殺死線程
- 6. 在java中殺死線程
- 7. 如何殺死主線程?
- 8. 殺死線程導致SIGSEGV
- 9. 默默殺死線程
- 10. 用pthreads殺死線程 - C
- 11. 殺死一個線程
- 12. 殺死一個線程
- 13. 殺死線程,真的!
- 14. 殺死暫停的線程
- 15. 線程殺死超時
- 16. 殺死非等待線程
- 17. 如何殺死Perl線程?
- 18. 如何殺死MFC線程?
- 19. 殺死事件線程
- 20. 取消或殺死一個pthread
- 21. 殺死等待條件變量的pthread
- 22. Python的線程,殺死線程
- 23. 殺死進程殺死其他進程
- 24. 如何在退出時殺死線程?
- 25. 在Python中殺死所有線程
- 26. 在java中殺死一個線程android
- 27. 後來在Python中殺死線程
- 28. 在PropertyListener中殺死一個線程(JavaFX8)
- 29. 在SwingUtilities.invokeLater()中殺死一個線程
- 30. 殺死主線從子線程python
pthread_cancel的問題是,如果你使用它,那麼在被取消的線程中運行的代碼必須理解取消點,並確保(a)它足夠頻繁地擊中一個,以至於它實際上被取消時間,以及(b)在發生這種情況時不會泄漏資源。這是一種棘手的問題,而如果你使用了一條消息,那麼當你的代碼完全可以在線程退出的時候顯式地顯示出來。 – 2010-01-18 11:07:56
@Steve:不幸的是,'pthread_cancel'是庫代碼*中唯一干淨的方式,用於中斷可能在系統調用中阻塞的線程。另一種方法是安裝中斷信號處理程序,並確保所有代碼都已準備好處理'EINTR',但庫代碼不能假定它有權更改信號處理或對調用方施加EINTR處理。 – 2011-03-24 17:08:03