天天看點

線程的狀态:分離(detached)和joinable(可結合的)

線程分離

在任意一個時間點上,線程是可結合(joinable)或者是可分離的(detached)。一個可結合線程是可以被其他線程收回資源和殺關閉。在被回收之前,他的存儲器資源(棧等)是不釋放的。而對于detached狀态的線程,其資源不能被别的線程收回和關閉,隻有等到線程結束才能由系統自動釋放

預設情況,線程狀态被設定為結合的。是以為了避免資源洩漏等問題,一個線程應當是被顯示的join或者detach的,否則線程的狀态類似于程序中的Zombie Process。會有部分資源沒有被回收的。

如果子線程處理分離狀态,将不能在該線程上使用pthread_join(),否則會出錯。傳回的錯誤碼是EINVAL,表示該線程不是可join的。不過,不同系統的實作是不一樣的。

阻塞的意思是 主線程會在調用pthread_join()處等待,直到子線程消亡了才會繼續往下執行。

pthread_detach使子線程進入分離狀态的意思是 主線程不能再用pthread_join()和子線程同步,就是說 對子線程調用 pthread_detach之後,主線程再調用pthread_join()不會導緻等待主線程阻塞等待,這時候主線程和子線程相當于兩個執行序列,兩者之間處于一種 分離 狀态。

linux線程中,pthread有兩種狀态joinable狀态和unjoinable狀态。

joinable狀态下,當線程函數自己傳回退出時或pthread_exit時都不會釋放線程所占用堆棧和線程描述符。隻有當你調用了pthread_join之後這些資源才會被釋放,這是需要main函數或者其他線程去調用pthread_join函數。

unjoinable狀态的線程,這些資源線上程函數退出時或pthread_exit時自動會被釋放。設定unjoinable狀态設定有兩種辦法 一是可以在pthread_create時指定,二是線程建立後線上程中pthread_detach自己 pthread_detach(pthread_self()),狀态改為unjoinable狀态,確定資源的釋放。

參考:Linux 多線程環境下 線程joinable狀态和unjoinable狀态

線程的分離狀态怎麼了解?

繼續閱讀