查詢資料了解到:Linux系統中程序的線程資源是有限的,表現為對於一個程序其能同時運行的線程數是有限的。而默認的條件下,一個線程結束后,其對應的資源不會被釋放,於是,如果在一個程序中,反復建立線程,而線程又默認的退出,則最終線程資源耗盡,進程將不再能建立新的線程。
解決這個問題,有2種方式,系統自動釋放線程資源,或者由另一個線程釋放該線程資源。
在這里,我認為進程運行后,本身,也是一個線程,主線程,主線程和主線程建立的線程共享進程資源。不同於其他線程,在於主線程運行結束后,程序退出,所有程序建立的線程也會退出。
方法一、系統自動釋放
如果想在線程結束時,由系統釋放線程資源,則需要設置線程屬性為detach(分離線程)。代碼上,可以這樣表示:
pthread_t t;
pthread_attr_t a;
//線程屬性
pthread_attr_init(&a);
//初始化線程屬性
pthread_attr_setdetachstate(&a, PTHREAD_CREATE_DETACHED);
//設置線程屬性
pthread_create( &t, &a, GetAndSaveAuthviewSDRStub, (
void
*)lp);
//建立線程
|
方法二、其他線程釋放
另一種方式,則是由另一個線程將該資源釋放。代碼上,可以這樣表示:
pthread_t t;
pthread_create( NULL, NULL, GetAndSaveAuthviewSDRStub, (
void
*)lp);
pthread_join( t);
|
pthread_join( t)等待線程t退出,並釋放t線程所占用的資源。當然,這里也有個同步的功能,使一個線程等待另一個線程退出,然后才繼續運行。
Linux線程執行與Windows不同,pthread有兩種狀態joinble狀態和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失敗。