關於pthread_detach(pthread_self())

 

關於pthread_detach(pthread_self())

 1313人閱讀 評論(0) 收藏 舉報
 

近來發現 在線程函數第一行調用 pthread_detach(pthread_self()) 返回值是22不是0,後來在網上找到以下話語:

linux線程執行和windows不同,pthread有兩種狀態joinable狀態和unjoinable狀態,如果線程是joinable狀態,當線程函數自己返回退出時或pthread_exit時都不會釋放線程所佔用堆棧和線程描述符(總計8K多)。只有當你調用了pthread_join之後這些資源纔會被釋放。 
若是unjoinable狀態的線程,這些資源在線程函數退出時或pthread_exit時自動會被釋放。

unjoinable屬性可以在pthread_create時指定,或在線程創建後在線程中pthread_detach自己,如:pthread_detach(pthread_self()),將狀態改爲unjoinable狀態,確保資源的釋放。或者將線程置爲joinable,然後適時調用pthread_join.

在程序運行中檢查/proc/ <pid> /maps文件,若看到大概8K左右的很多虛擬內存碎片,基本上可以確認是線程資源泄漏造成的300個線程後pthread_create失敗。

不知是否因爲自己,先對要創建的線程做了以下屬性設定,
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

然後又在線程函數中使用
pthread_detach(pthread_self());

兩段代碼作用有衝突。

===============================================================================

pthread_detach(threadid)和pthread_detach(pthread_self())的區別應該是調用他們的線程不同,沒其他區別。

pthread_detach(threadid)函數的功能是使線程ID爲threadid的線程處於分離狀態,一旦線程處於分離狀態,該線程終止時底層資源立即被回收;否則終止子線程的狀態會一直保存(佔用系統資源)直到主線程調用pthread_join(threadid,NULL)獲取線程的退出狀態。
通常是主線程使用pthread_create()創建子線程以後,一般可以調用pthread_detach(threadid)分離剛剛創建的子線程,這裏的threadid是指子線程的threadid;如此以來,該子線程止時底層資源立即被回收;
被創建的子線程也可以自己分離自己,子線程調用pthread_detach(pthread_self())就是分離自己,因爲pthread_self()這個函數返回的就是自己本身的線程ID。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章