pthread_create 内存泄漏 valgrind
2016-01-13 11:56
489 查看
pthread_create()在使用的过程中遇到的一个问题:
今天在使用线程的时候出现了一个问题,利用valgrind监测程序的运行时出现了memory leak。感觉到很奇怪,这样的情况应该不会发生的啊,毕竟是系统的函数。去网上搜了下,发现国内国外都有这个问题 呵呵。大概了解了下原因:创建的线程需要进行join或者detach状态,这样才能保证创建线程过程中分配的内存得以释放,才能避免memory leak的情况。因此,记得需要将线程进行join或者detach。
线程的分离状态决定一个线程以什么样的方式来终止自己。线程的默认属性是非分离状态,这种情况下,原有的线程等待创建的线程结束。只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。而分离线程不是这样子的,它没有被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源。程序员应该根据自己的需要,选择适当的分离状态。
有以下的方法来解决这个问题:
1、创建线程,使用默认的非分离状态,然后进行join
pthread_create(&threadid, NULL, func, NULL);
pthread_join(threadid, &state);
2、创建线程时利用pthread_attr_setdeatchstate()指定线程的属性为PTHREAD_CREATE_DETACHED
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create(&threadid, &attr, func, NULL);
pthread_attr_destroy(&attr);
3、在默认创建完进程后,使用pthread_detach函数,使得线程处于detach状态;或者在func中调用pthread_detach函数,线程自行退出
pthread_create(&threadid, NULL, func, NULL);
pthread_detach(threadid);
或者:
pthread_create(&threadid, NULL, func, NULL);
void* func(void*)
{
…
…
pthread_detach(pthread_self());
return ((void*)0);
}
今天在使用线程的时候出现了一个问题,利用valgrind监测程序的运行时出现了memory leak。感觉到很奇怪,这样的情况应该不会发生的啊,毕竟是系统的函数。去网上搜了下,发现国内国外都有这个问题 呵呵。大概了解了下原因:创建的线程需要进行join或者detach状态,这样才能保证创建线程过程中分配的内存得以释放,才能避免memory leak的情况。因此,记得需要将线程进行join或者detach。
线程的分离状态决定一个线程以什么样的方式来终止自己。线程的默认属性是非分离状态,这种情况下,原有的线程等待创建的线程结束。只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。而分离线程不是这样子的,它没有被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源。程序员应该根据自己的需要,选择适当的分离状态。
有以下的方法来解决这个问题:
1、创建线程,使用默认的非分离状态,然后进行join
pthread_create(&threadid, NULL, func, NULL);
pthread_join(threadid, &state);
2、创建线程时利用pthread_attr_setdeatchstate()指定线程的属性为PTHREAD_CREATE_DETACHED
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create(&threadid, &attr, func, NULL);
pthread_attr_destroy(&attr);
3、在默认创建完进程后,使用pthread_detach函数,使得线程处于detach状态;或者在func中调用pthread_detach函数,线程自行退出
pthread_create(&threadid, NULL, func, NULL);
pthread_detach(threadid);
或者:
pthread_create(&threadid, NULL, func, NULL);
void* func(void*)
{
…
…
pthread_detach(pthread_self());
return ((void*)0);
}
相关文章推荐
- 在linux下用tomcat部署java web项目的过程与注意事项
- I/O复用
- 解决openwrt下make时出现的 has both : and :: entries 错误
- Redis入门使用,以及Jedis操作
- Alcatraz的安装和使用
- 一步一步学Android ROM开发(一)——修改现有ROM资源文件
- jdbc------连接池代理
- 【Androoid的事件处理】-----异步任务
- HDU 5607 graph(矩阵优化+概率DP)
- 视频编码器评測系统:VideoCodecRank
- Nginx配置文件nginx.conf中文详解
- 在论坛中出现的比较难的sql问题:30(row_number函数 物料组合问题)
- 全站https的原理
- C#源代码—演示抽象类与抽象属性的使用,命名空间的使用
- 通过SQL ID查询SQL Text
- ThinkpadE450开启Intel VT
- 【总结】C++ 出现内存问题
- Linux 端口管理
- cocos的init函数
- JAVA生成XML文件