Linux内存烧坏现象,Linux线程导致的内存泄漏分析及解决

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的话,线程的资源会一直得不到释放而导致内存泄漏!一时的图快后患无穷啊。

解决办法:

代码

1 // 最简单的办法,在线程执行结束后调用 pthread_detach让他自己释放

2 pthread_detach(pthread_self());

3 // 或者创建线程前设置 PTHREAD_CREATE_DETACHED 属性

4 pthread_attr_t attr;

5 pthread_t thread;

6 pthread_attr_init (&attr);

7 pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);

8 pthread_create (&thread, &attr, &thread_function, NULL);

9 pthread_attr_destroy (&attr);

第2行的那种方法最简单,在线程函数尾部加上这句话就可以将线程所占用的资源给释放掉;或者像 5-11 所示的方法设置detach属性,这样也会在线程return/pthread_exit后释放内存。

其实仔细想想,valgrind检查时已经提示了pthread_create没有释放的问题,只是之前没引起注意。其实这样的问题也只有在长时间运行时,慢慢积累这一点点的内存才会暴露出来,看来valgrind的提示也不能置之不理啊。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值