Linux 多線程編程--線程退出


今天分析項目中進程中虛存一直增長問題,運行10個小時虛存漲到121G ,RSS占用為16G 非常恐怖。

Valgrind測試無內存泄漏。

內存32G 64bit系統信息如下:

Linux線程使用方式是主進程依據請求的多少動態創建和退出線程。通過pmap -x pid查看進程內個部分內存分配情況:

發現大量如下占用:

通過查詢可知[anon]為未實際分配的內存,即虛存;通過如下命令計算出一共有11946個,每個對應10M總大小為 119460≈119G

 1 cat process_info.txt |grep 10240|wc -l   

好到此大概定位到,是這個部分虛存占用過多;

查看系統進程虛存限制:

從倒數第二項可知,系統對進程虛存無限制。棧大小為10M 剛好和[anon]每一項的

大小相等,現在懷疑是線程創建后未釋放內存返回去查看代碼,發現每個工作線程都

調用了pthread_exit了,后面再進一步分析發現鏈接線程中在調用pthread_exit之

前未調用pthread_detach,導致線程雖然調用了pthread_exit,但是系統並不會

真正釋放線程所占資源。而valgrind測試時是進程退出,線程所占內存會全部釋放。

所以valgrind測試不出內存泄漏。

 

總結

兩種解決方式:

1.創建線程設置線程屬性為

 1 pthread_attr_init(&attr);

2 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 

2.在線程函數第一行調用  

1 pthread_detach(pthread_self()); 

 

 

順便查看了下系統中如下信息:

順便查了下Linux單進程能創建線程的上限,以及相關內容。

查看系統進程和線程數上限:

進程上限為:32768

進程內的線程上限為:514960  計算方式為512G/10M = 512*1024M/10M = 52428.8 和系統顯示的差距比較大,這個原因不明。。等有時間在進一步查證。。

 


免責聲明!

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



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