线程内存泄露问题

最近在定位一个创建线程失败的问题,创建线程,线程执行完毕后自动销毁,大概运行1.5天后,就会出现线程创建失败情况。

计算了一下线程创建次数,大概在1800次左右。怀疑是内存不够导致,使用top命令查看内存增长情况,发现有一个进程内存占用率不断增加,检查代码排除掉申请堆空间忘释放情况,上网搜了一下,发现使用pthread_create(&threadid, NULL, func, NULL);形式创建的线程,需要主动释放线程内存空间,否则就会导致内存泄露。该内存仅仅指创建线程时描述表占用的内存空间,不包括线程内存使用malloc申请的堆内存空间。

线程属性分为:分离式和非分离式。分离与非分离主要是指父进程与子进程之间的关系。分离式当线程退出时,内存空间会自动释放,非分离式需要外部线程主动调用内存释放函数pthread_join进行内存释放,否则就会导致内存泄露。


可以通过以下方法来解决线程内存泄露问题:
1、创建线程,使用默认的非分离状态,然后进行使用pthread_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);

总结:在linux编程中,应该尽量避免频繁创建线程和终止线程。创建线程时,当线程结束时,注意回收线程内存资源。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值