linux c 线程 内存,Linuxc - 多线程pthread内存泄露

linuxc-多线程pthread内存泄露

定位pthread内存泄露

目标文件:/proc//maps

若其中出现了大量的8K左右的内存碎片,则说明出现了内存泄露。同理,如果相应pid进程的maps文件中出现了很多内存碎片,也说明出现了内存泄露。

解决pthread内存泄露

​ 查询资料了解到:Linux系统中程序的线程资源是有限的,表现为对于一个程序其能同时运行的线程数是有限的。而默认的条件下,一个线程结束后,其对应的资源不会被释放,于是,如果在一个程序中,反复建立线程,而线程又默认的退出,则最终线程资源耗尽,进程将不再能建立新的线程。

​ 解决这个问题,有2种方式,系统自动释放线程资源,或者由另一个线程释放该线程资源。

​ 在这里,我认为进程运行后,本身,也是一个线程,主线程,主线程和主线程建立的线程共享进程资源。不同于其他线程,在于主线程运行结束后,程序退出,所有程序建立的线程也会退出。

方法一、系统自动释放

如果想在线程结束时,由系统释放线程资源,则需要设置线程属性为detach(分离线程)。

代码上,可以这样表示:

pthread_t t;

pthread_attr_t a; //线程属性

pthread_attr_init(&a); //初始化线程属性

pthread_attr_setdetachstate(&a, PTHREAD_CREATE_DETACHED); //设置线程属性

pthread_create( &t, &a, GetAndSaveAuthviewSDRStub, (void*)lp); //建立线程

方法二、其他线程释放

另一种方式,则是由另一个线程将该资源释放。

代码上,可以这样表示:

pthread_t t;

pthread_create( NULL, NULL, GetAndSaveAuthviewSDRStub, (void*)lp);

pthread_join( t);

​ pthread_join( t)等待线程t退出,并释放t线程所占用的资源。当然,这里也有个同步的功能,使一个线程等待另一个线程退出,然后才继续运行。

​ Linux线程执行与Windows不同,pthread有两种状态joinble状态和unjoinable状态,如果线程是joinable状态,当线程函数自己返回退出时或pthread_exit时都不会释放线程所占用堆栈和线程描述符(总计8K多)。只有当你调用了pthread_join之后这些资源才会被释放。若是unjoinable状态的线程,这些资源在线程函数退出时或pthread_exit时自动回被释放。

​ unjoinable属性可以在pthread_create时指定,或在线程创建后在线程中pthread_detach自己。如pthread_detach(pthread_self()),将状态改为unjoinable状态,确保资源的释放。或者将线程置为joinable,然后适时调用pthread_join。

​ 在线程运行中检查/proc//maps文件,若看到大量8k左右的很多虚拟内存碎片,基本上可以确认是线程资源泄露造成的。连续创建300个线程后,pthread_create失败。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值