资讯专栏INFORMATION COLUMN

Linuxc - 多线程pthread内存泄露

Simon_Zhou / 912人阅读

摘要:多线程内存泄露定位内存泄露目标文件若其中出现了大量的左右的内存碎片,则说明出现了内存泄露。在线程运行中检查文件,若看到大量左右的很多虚拟内存碎片,基本上可以确认是线程资源泄露造成的。连续创建个线程后,失败。

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失败。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/63170.html

相关文章

  • Linuxc - posix信号量的应用(生产者-消费者)

    摘要:信号量和互斥锁的区别互斥锁只允许一个线程进入临界区,而信号量允许多个线程同时进入临界区。其中表示缓冲区的空单元数,初始值为表示缓冲区非空单元数,初始值为是互斥信号量,初始值为当然也可以用互斥锁来实现互斥操作。 linuxc-posix信号量的应用(生产者-消费者) 在unix环境高级编程中提到了两种信号量,两种信号量作用和应用场景基本相同,但是posix信号量更常用,跨平台能力强,性能...

    marek 评论0 收藏0
  • Linuxc - 信号量

    摘要:信号量信号灯,也叫信号量,它是不同进程间或一个给定进程内部不同线程间同步的机制。不同进程通过使用同一个信号键值来获得同一个信号量初始化信号量,此时使用函数的操作。当使用二维信号量时,通常将信号量初始化为进行信号量的操作,此时调用函数。 linuxc-信号量 ​ 信号灯(semaphore),也叫信号量,它是不同进程间或一个给定进程内部不同线程间同步的机制。 ​ 信号灯种类:...

    Kyxy 评论0 收藏0
  • Linux编程学习笔记 | Linux线程学习[2] - 线程的同步

    摘要:死锁指的是两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象。总结这篇文章主要介绍了多线程中同步的重要性和线程同步的三种方法。 什么是线程的同步 当有多个线程要同时对一个共享的内存空间进行读写时,我们要保证这个内存空间对于多个线程来说是一致的。当多个线程同时读/写这个内存空间时,就需要对线程进行同步,以确保任何时刻只有一个线程能修改该内存空间,这样才能保证线程不会访...

    zsirfs 评论0 收藏0
  • Linuxc - 关于Linux的应用层定时器

    摘要:关于的应用层定时器使用定时器的目的无非是为了周期性的执行某一任务,或者是到了一个指定时间去执行某一个任务。程序可以将成员设为来防止定时器到期时产生信号。启动一个定时器所创建的定时器并未启动。如同,用于指定当前的定时器到期时间。 linuxc-关于Linux的应用层定时器 使用定时器的目的无非是为了周期性的执行某一任务,或者是到了一个指定时间去执行某一个任务。要达到这一目的,一般有两个常...

    dantezhao 评论0 收藏0
  • Linux编程学习笔记 | Linux线程学习[1] - 线程的创建和基本控制

    摘要:在及中也被称为轻量进程,但轻量进程更多指内核线程,而把用户线程称为线程。这会导致该线程变成了僵尸线程。主线程在上面的几节中,我们讲了线程的创建,结束和连接。这节我们来看一个特殊的线程主线程。 文章系列原因 2017年年初,我给自己定了一个小小的目标:学习Linux编程,并通过网络来分享自己的学习心得。为了完成这个小小的目标,我开始用通过写文章来记录我的学习心得,希望在年底时,我能完成2...

    frolc 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<