欢迎来到天天文库
浏览记录
ID:38817403
大小:43.00 KB
页数:4页
时间:2019-06-19
《Linux程序设计中由线程使用不当引起的内存泄漏》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、****技术期刊2007年7月总1期内部发行,注意保密Linux程序设计中由线程使用不当引起的内存泄漏作者:吴亮Linux程序设计中,创建线程时调用pthread_create()函数,该函数原型如下:intpthread_create(pthread_t*thread,constpthread_attr_t*attr,void*(*start_routine)(void*),void*arg);其中第二个参数attr为线程属性指针,一般情况下,我们创建线程时,若对线程属性没有特殊要求,都将此参数设为NULL。这也就使用了线程的默认属性——非分离状态(joinable,或称可接
2、合状态)。之后,主线程必须在适当的时候调用pthread_join(),来接合(join,或等待,同步)子线程,同时释放线程本身占用的资源。否则,线程资源将驻留内存,直到整个进程退出为止,若进程会不断的创建线程,则每创建一次线程都会导致内存资源的消耗,很明显,这样就会构成内存泄漏!关于这个问题,本人查到了一些佐证:(1)Linuxmanpage里是这样讲的:Whenajoinablethreadterminates,itsmemoryresources(threaddescriptorandstack)arenotdeallocateduntilanotherthreadper
3、formspthread_joinonit.Therefore,pthread_joinmustbecalledonceforeachjoinablethreadcreatedtoavoidmemoryleaks.(2)《Linux高级编程》里是这样讲的:可接合(非分离态的,需要等待)的线程,就像一个进程一样,当它执行结束时,并没有被GNU/Linux自动清理,而它的退出状态却仍在系统内挂着(这有点像僵尸进程),直到另一个线程调用pthread_join()获取其返回值时,其资源才被释放。*********************************************
4、********对于线程资源的释放,有两种实现方法:(1)调用pthread_join()线程创建时,默认属性是可接合的(joinable),那就需要主线程来等待,所以在创建这个线程后适当的时候就必须调用pthread_join()来等待子线程结束执行,否则就会引起内存泄漏!在调用pthread_create()开线程后,若线程属性是joinable,则必须调用pthread_join()来等待子线程结束执行,这是Linux同步主线程和子线程的一个机制,但是,这并不等于说,我要在pthread_create()开线程后立即调用pthread_join()来等待该线程结束执行,的
5、确,那样的话跟你用普通函数调用来实现是没有区别的,你完全可以在pthread_create()开线程后去做别的事情,等你觉得应该等待该线程结束执行时再调用pthread_join()。这就是说,假如你的线程采用了默认属性joinable,4星网视易信息系统有限公司版权所有****技术期刊2007年7月总1期内部发行,注意保密你就必须在适当的时候调用pthread_join()来同步主线程和子线程,同时释放子线程的资源(线程描述符和堆栈,threaddescriptorandstack)。假如你用了默认线程属性,即线程属性为joinable,而又没有在适当的时候调用pthread
6、_join(),那么该线程所占用的资源便不会被释放(kindoflikeazombieprocess),因此造成内存泄漏。(2)将线程属性设为分离状态(detached)假如你不想或没有必要同步主线程和子线程,那么就把子线程属性设置为detached分离状态,那么子线程结束执行后会自行销毁其占用的资源。将线程属性设为分离状态(detached),这样,子线程就属于自我销毁那种,子线程函数启动后跟主线程不再有"父子"关系(等待和被等待),退出线程时其资源会释放。注意:创建线程时,若属性参数为NULL,则线程属性默认为可接合的(joinable,即需要主线程等待的)。可以在线程创建
7、时将其属性设为分离状态(detached),也可在线程创建后将其属性设为分离的(detached)。*****************************************************下面给出分离态和非分离态线程创建的代码框架:(1)使用线程默认属性创建线程的代码框架#includevoid*thread_function(void*thread_arg){/*Doworkhere...*/pthread_exit(“Exitingfromthet
此文档下载收益归作者所有