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 和系统显示的差距比较大,这个原因不明。。等有时间在进一步查证。。

 

posted @ 2016-09-23 19:05  iByte  阅读(3925)  评论(0编辑  收藏  举报