线程的状态:分离(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狀態
線程的分離狀態怎么理解?
總結
以上是生活随笔為你收集整理的线程的状态:分离(detached)和joinable(可结合的)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线程的切入和切出(切入: 一个线程被系统
- 下一篇: 多线程pthread_join()的作用