2010-01-18 202 views
35

我用pthread_create(&thread1, &attrs, //... , //...);並需要如果發生某種情況需要殺死這個線程如何殺死這個?殺死線程在pthread庫

回答

50

第一家門店線程ID

pthread_create(&thr, ...) 

然後再打

pthread_cancel(thr) 

然而,這不是建議的編程習慣!最好使用線程間通信機制(如信號量或消息)來與線程通信以停止執行。

請注意,pthread_kill(...)並不實際終止接收線程,而是向它發送一個信號,它取決於信號和信號處理程序會發生什麼。

+4

pthread_cancel的問題是,如果你使用它,那麼在被取消的線程中運行的代碼必須理解取消點,並確保(a)它足夠頻繁地擊中一個,以至於它實際上被取消時間,以及(b)在發生這種情況時不會泄漏資源。這是一種棘手的問題,而如果你使用了一條消息,那麼當你的代碼完全可以在線程退出的時候顯式地顯示出來。 – 2010-01-18 11:07:56

+11

@Steve:不幸的是,'pthread_cancel'是庫代碼*中唯一干淨的方式,用於中斷可能在系統調用中阻塞的線程。另一種方法是安裝中斷信號處理程序,並確保所有代碼都已準備好處理'EINTR',但庫代碼不能假定它有權更改信號處理或對調用方施加EINTR處理。 – 2011-03-24 17:08:03

2

查看pthread_kill()函數。

+2

這不殺死任何線程,它只是發送一個信號。 – alk 2014-11-22 11:53:36

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) 

這會殺死線程。