快速业务通道

Linux线程导致的内存泄漏分析及解决

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-17

  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的提示也不能置之不理啊.

拥有帝国一切,皆有可能。欢迎访问phome.net

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号