下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Linux程序设计中由线程使用不当引起的内存泄漏作者:吴亮Linux程序设计中,创建线程时调用pthread_create(函数,该函数原型如下:int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine(void *, void *arg;其中第二个参数attr为线程属性指针,一般情况下,我们创建线程时,若对线程属性没有特殊要求,都将此参数设为NULL。这也就使用了线程的默认属性非分离状态(joinable,或称可接合状态。之后,主线程必须在适当的时候调用pthread_joi
2、n(,来接合(join,或等待,同步子线程,同时释放线程本身占用的资源。否则,线程资源将驻留内存,直到整个进程退出为止,若进程会不断的创建线程,则每创建一次线程都会导致内存资源的消耗,很明显,这样就会构成内存泄漏!关于这个问题,本人查到了一些佐证:(1)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 i
3、t. Therefore, pthread_join must be called once for each joinable thread created to avoid memory leaks.(2)Linux高级编程里是这样讲的:可接合(非分离态的,需要等待的线程,就像一个进程一样,当它执行结束时,并没有被GNU/Linux自动清理,而它的退出状态却仍在系统内挂着(这有点像僵尸进程,直到另一个线程调用pthread_join(获取其返回值时,其资源才被释放。* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
4、 * * * * * * * * * * * * * * * * * * * * * 对于线程资源的释放,有两种实现方法:(1)调用pthread_join(线程创建时,默认属性是可接合的(joinable,那就需要主线程来等待,所以在创建这个线程后适当的时候就必须调用pthread_join(来等待子线程结束执行,否则就会引起内存泄漏!在调用pthread_create(开线程后,若线程属性是joinable,则必须调用pthread_join(来等待子线程结束执行,这是 Linux同步主线程和子线程的一个机制,但是,这并不等于说,我要在pthread_create(开线程后立即调用pthr
5、ead_join(来等待该线程结束执行,的确,那样的话跟你用普通函数调用来实现是没有区别的,你完全可以在pthread_create(开线程后去做别的事情,等你觉得应该等待该线程结束执行时再调用pthread_join(。这就是说,假如你的线程采用了默认属性joinable,你就必须在适当的时候调用pthread_join(来同步主线程和子线程,同时释放子线程的资源(线程描述符和堆栈,thread descriptor and stack。假如你用了默认线程属性,即线程属性为joinable,而又没有在适当的时候调用pthread_join(,那么该线程所占用的资源便不会被释放(kind of
6、 like a zombie process,因此造成内存泄漏。(2)将线程属性设为分离状态(detached假如你不想或没有必要同步主线程和子线程,那么就把子线程属性设置为detached分离状态,那么子线程结束执行后会自行销毁其占用的资源。将线程属性设为分离状态(detached,这样,子线程就属于自我销毁那种,子线程函数启动后跟主线程不再有"父子"关系(等待和被等待,退出线程时其资源会释放。注意:创建线程时,若属性参数为NULL,则线程属性默认为可接合的(joinable,即需要主线程等待的。可以在线程创建时将其属性设为分离状态(detached,也可在线程创建后将其
7、属性设为分离的(detached。* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 下面给出分离态和非分离态线程创建的代码框架:(1)使用线程默认属性创建线程的代码框架#include void* thread_function (void* thread_arg/* Do work here. */pthread_exit(“Exiting from the thread_function!”; int main (pthread_
8、t thr; void* thread_result;pthread_create (&thr, NULL, &thread_function, NULL;/* Do other work here. */* The second thread must be joined by the initial(calling thread before exit or elsewhere to avoid MEMORY LEAKS */ pthread_join(thr, &thread_result; return 0; (2)将线程属性设为detached的两种方法的代码
9、框架方法一,在线程创建时,通过属性变量设置#include void* thread_function (void* thread_arg/* Do work here. */pthread_exit(.; int main (pthread_attr_t attr;pthread_t thread;pthread_attr_init (&attr;pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED;pthread_create (&thread, &attr, &thread_func
10、tion, NULL;pthread_attr_destroy (&attr;/* Do work here. */* No need to join the second thread. */return 0; 方法二:线程创建后,通过调用pthread_detach(来设置注意:如果thread_function(做的工作足够少的话,在pthread_create(返回线程ID前,thread_function(可能就已经结束了,而这个线程ID可能又被系统分配给了新创建的线程,假如新线程不打算使用分离态,那下面的pthread_detach(调用就会引起错乱,实际上原来要设为分离态的线程并没有设为分离态,假如再没有调用pthread_join(的话(实际上也不会,因为调用了pthread_detach(就不该再调用pthread_join(,而且此时join的实际上是新线程,那就会导致该线程的资源不被释放,而又引起内存泄露。所以在这儿,pthread_detach(的调用还是需要综合考量的。#include void* thread_function (void* thread_arg/* Do work here. */pthread_exit(.; int main
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年鲤城区新步实验小学秋季招聘合同制顶岗教师备考题库完整答案详解
- 2025年永康市农机产业园开发有限公司公开招聘国有企业合同制员工7人备考题库完整答案详解
- 2025年宁夏黄河农村商业银行科技人员社会招聘备考题库及一套完整答案详解
- 重大安全隐患排查治理和建档监控等制度
- 中国电建集团昆明勘测设计研究院有限公司招聘20人备考题库及参考答案详解1套
- 2025年关于为淄博市检察机关公开招聘聘用制书记员的备考题库及一套答案详解
- 2025年青岛市李沧区人民法院公开招聘司法辅助人员备考题库参考答案详解
- 2025年首都医科大学附属北京朝阳医院石景山医院派遣合同制职工招聘备考题库及答案详解1套
- 银联企业服务(上海)有限公司2026年度招聘备考题库及参考答案详解1套
- plc课程设计彩灯循环
- GB/T 39693.4-2025硫化橡胶或热塑性橡胶硬度的测定第4部分:用邵氏硬度计法(邵尔硬度)测定压入硬度
- 2025年直播带货主播服务合同范本
- 2025年青海省政府采购评审专家考试测试题及答案
- 2025年山东泰山药业集团有限公司招聘(21人)笔试备考试题及答案解析
- 心电监测线路管理规范
- 北京市西城区2024-2025学年七年级上学期期末道德与法治试卷
- 年生产加工钠离子电池负极材料8000 吨、锂离子电池负极材料3000吨项目环境风险专项评价报告环评报告
- (正式版)DB37∕T 4899-2025 《深远海养殖管理工作指南》
- 监理工作制度(水利工程)
- 拖拉机运输协议合同范本
- 辽宁省安全生产条例讲解
评论
0/150
提交评论