linux 線程創建后需要釋放


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,現在線程可以無限創建並執行

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM