这两天在看Pthread 资料的时候,无意中看到这样一句话(man pthread_detach):
Either pthread_join(3) or pthread_detach() should be called for each thread that an application creates, so that system resources for the thread can be released. (But note that the resources of all threads are freed when the process terminates.)
也就是说:每个进程创建以后都应该调用pthread_join 或 pthread_detach 函数,只有这样在线程结束的时候资源(线程的描述信息和stack)才能被释放.
之后又查了pthread_join 但是没有明确说明必须调用pthread_join 或 pthread_detach.
但是再查了 Pthread for win32 pthread_join
When a joinable thread terminates, its memory resources (thread descriptor and stack) are not deallocated until another thread performs pthread_join on it. Therefore, pthread_join must be called once for each joinable thread created to avoid memory leaks.
最近解决了一个隐蔽的内存泄漏问题,我们的进程是HA模式,用户不停的切换,会导致内存不停的增长,切换一次,再切回来内存便增加8M左右。原因就是是pthread_create后的僵死线程没有释放导致的内存持续增长。
pthread_create (&thread, NULL, &thread_function, NULL); 就这么写了,参数2没有设置线程结束后自动detach,并且没有使用pthread_join或pthread_detach释放执行结束后线程的空间!
Linux man page 里有已经说明了这个问题:
When a joinable thread terminates, its memory resources (thread descriptor and stack) are not deallocated until another thread performs pthread_join on it. Therefore, pthread_join must be called once for each joinable thread created to avoid memory leaks.
也就说线程执行完后如果不join的话,线程的资源会一直得不到释放而导致内存泄漏!
解决办法:
创建线程前设置 PTHREAD_CREATE_DETACHED 属性
pthread_attr_t attr;
pthread_t thread;
thread_attr_init (&attr);
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
pthread_create (&thread, &attr, &thread_function, NULL);
pthread_attr_destroy (&attr);
这样就会在线程return/pthread_exit后释放内存。
其实用valgrind检查时会提示pthread_create没有释放的问题,这样的问题也只有在长时间运行时,慢慢积累这一点点的内存才会暴露出来。
属性值不能直接设置,须使用相关函数进行操作,初始化的函数为pthread_attr_init,这个函数必须在pthread_create函数 之前调用。属性对象主要包括是否绑定、是否分离、堆栈地址、堆栈大小、优先级。默认的属性为非绑定、非分离、缺省1M的堆栈、与父进程同样级别的优先级。
线程的分离状态决定一个线程以什么样的方式来终止自己。在上面的例子中,我们采用了线程的默认属性,即为非分离状态,这种情况下,原有的线程等待 创建的线程结束。只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。而分离线程不是这样子的,它没有被其 他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源。程序员应该根据自己的需要,选择适当的分离状态。设置线程分离状态的函数为pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)。第二个参数可选为PTHREAD_CREATE_DETACHED(分离线程)和 PTHREAD _CREATE_JOINABLE(非分离线程)。
相关推荐
Linux 静态编译时使用的libc和pthread库
linux pthread 库在移植到win32和测试程序 pthread的函数使用正常
一个示例程序,演示在linux环境下如何使用pthread实现多线程的使用和控制。
详细介绍了Linux下pthread线程库,并对线程创建与结束、线程的绑定、线程的状态、线程的优先级、线程的撤消、线程数据、互斥锁、条件变量、信号量、异步信号等都有详细的说明,并附有例子,帮助读者由浅入深的了解...
Linux pthread相关函数用法说明(包括发生段错误的原因以及对策等)
(完整word版)LinuxPthread深入解析.doc
arm—linux线程程序,适用于arm-linux线程编程的学习。
本资料包含绝大多数的linux下线程编程所需要的技术实例,文档,API详解等等
linux下C语言的线程包,这是第一部分,还有一个
由浅入深Linux下pthread线程库介绍[归类].pdf
计算10,000,000内素数个数,Pthread编写线程数可调整。
为给兄弟们扫盲,从网上整理的一些东东,希望对大家有帮助。 Threads Pthread Pthread Mutex Pthread Condition variables Pthread Main API
linux 多线程编程 pthread 中文文档 已经添加目录
Linux下使用pthread库编写的简单的多线程程序,在调用线程时绑定了内核
并行计算pthread多线程求pi的三种方法,编译后在命令行后输入线程数以及计算规模n运行
Linux系统下的多线程遵循POSIX线程接口,称为pthread。编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。顺便说一下,Linux下pthread的实现是通过系统调用clone()来实现的。...
请把该目录复制到 /opt/FriendlyARM/QQ2440目录中,编译使用时进入其中一个子目录,运行make即可。 该目录的 linux压缩包位于本光盘的linux目录中,名字为:examples.tgz
pthread, window pthread
把解压库文件中的Pre-built.2文件夹中的lib,include文件复制,黏贴到c盘:Microsoft Visual Studio/VC98中去,和里面ib,include两个文件合并;再把Pre-built.2文件夹中的lib中的*dll文件复制黏贴到启动文件根目录...