linux 線程創建后需要釋放
個人經歷: 在寫嵌入式LINUX 應用時用到線程,使用pthread_cread創建線程,但在第252次創建時,發現線程並沒有執行,經過一翻DEBUG后,發現pthread_cread()返回錯誤碼
11,創建線程失敗。在度娘一下這個錯誤碼11
下面引用來自帖子的解釋:https://blog.csdn.net/cry1994/article/details/52649520
不同的機器上最終計數不同,但是結果應該是一樣的。
pthread_create()返回11的錯誤碼表示Resource temporarily unavailable
資源暫時不可用,按理說線程return 0后資源應該自動釋放,同時我使用free查看發現內存也是足夠的。
經過多方面查找資料,得知linux線程執行和windows不同,pthread有兩種狀態joinable狀態和unjoinable狀態,默認的狀態是joinable。
如果線程是joinable狀態,當線程函數自己返回退出時或pthread_exit時都不會釋放線程所占用堆棧和線程描述符(總計8K多),它的狀態類似於進程中的Zombie Process(僵屍進程)。只有當調用了pthread_join之后這些資源才會被釋放。
若是unjoinable狀態的線程,這些資源在線程函數退出時或pthread_exit時自動會被釋放。
但是調用pthread_join(pthread_id)后,如果該線程沒有運行結束,調用者會被阻塞,如果不需要阻塞的情況下,這時可以在子線程中加入代碼
pthread_detach(pthread_self())
或者父線程調用
pthread_detach(test_tid)(非阻塞,可立即返回)
這將該子線程的狀態設置為detached,則該線程運行結束后會自動釋放所有資源。
————————————————
版權聲明:本文為CSDN博主「Lonely丶靜默」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/cry1994/java/article/details/52649520
結束:
最終我在我的執行線程的最后一個語句為:pthread_detach(pthread_self()) ;便解決了前文所述BUG,現在線程可以無限創建並執行
