Linux 多執行緒程式設計 執行緒退出

2022-02-20 04:07:47 字數 1161 閱讀 8305

今天分析專案中程序中虛存一直增長問題,執行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);

1 pthread_detach(pthread_self());

順便檢視了下系統中如下資訊:

檢視系統程序和執行緒數上限:

程序上限為:32768

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

多執行緒退出

多執行緒退出,有兩種安全的退出方法。呼叫waitforsingleobject。必須在同乙個執行緒,否則會造成阻塞。例子如下 m pthreadrec afxbeginthread thread tcpserverreceive,this uint thread tcpserverreceive l...

多執行緒程式設計(一) 執行緒建立和退出

一 引言 二 例項 以下例項中建立了2個執行緒,其中第乙個執行緒是在程式執行到中途時呼叫pthread exit函式退出,第二個正常退出。在主線程中,收集這兩個執行緒的退出資訊,並釋放資源。從例項可以看出,這兩個執行緒是併發執行的。thread.c include include void thre...

多執行緒程式設計(一) 執行緒建立和退出

一 引言 二 例項 以下例項中建立了2個執行緒,其中第乙個執行緒是在程式執行到中途時呼叫pthread exit函式退出,第二個正常退出。在主線程中,收集這兩個執行緒的退出資訊,並釋放資源。從例項可以看出,這兩個執行緒是併發執行的。cpp view plain copy thread.c inclu...