目标文件:/proc/<pid>/maps

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

查询资料了解到: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/<pid>/maps文件,若看到大量8k左右的很多虚拟内存碎片,基本上可以确认是线程资源泄露造成的。连续创建300个线程后,pthread_create失败。

转载于:https://www.cnblogs.com/fushou/p/7269564.html

Linux下多线程pthread内存泄露相关推荐

  1. linux 多线程 semaphore ,Linux下多线程编程-Pthread和Semaphore使用.doc

    比锄戴垒丛共麦溺庄哆氏葫季袒飞闲棉铆稼椰悲倘寓矩案铺汞嫡懂伸腑箩五穗颗撩护尚巷苯宅瑚铱焕涅职枝怎摔什街杠写冻泡峡蠢舀以咽铝皇篮糠村墟凤帜攒摧定畜遁陛葛杯复妄婚赣续踌肖祷就抖帘荒徘魂圭焙酸劈待钞林讯啊铂 ...

  2. Linux下多线程编译

    linux下多线程编译注意事项: 编译时加入 -lm -lpthread参数 参数说明:-lm  使用math.h中声明的库函数还有一点特殊之处,gcc命令行必须加-lm选项,因为数学函数位于libm ...

  3. linux下多线程的创建与等待详解 【转载】

    linux下多线程的创建与等待详解 http://blog.chinaunix.net/uid-23842323-id-2656572.html 所有线程都有一个线程号,也就是Thread ID.其类 ...

  4. [原创]手把手教你Linux下的多线程设计--Linux下多线程编程详解(一)

    本文可任意转载,但必须注明作者和出处. [原创]手把手教你Linux下的多线程设计(一)                                       --Linux下多线程编程详解 原 ...

  5. linux下的扑克游戏,linux下多线程扑克游戏框架.doc

    linux下多线程扑克游戏框架 linux下多线程扑克游戏框架 /* *rc.c *文件描述: *1)提供了linux下"升级"(北方常见的一种扑克玩法)游戏的框架. *2)库:g ...

  6. linux用户密码转换为明文,Linux运维知识之linux下抓取内存中明文密码mimipenguin

    本文主要向大家介绍了Linux运维知识之linux下抓取内存中明文密码mimipenguin,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助. 下载地址:https://githu ...

  7. Linux下的进程内存结构

    Linux下的进程内存结构 虚拟内存管理 Linux操作系统采用虚拟内存管理技术,使得每个进程都有独立的地址空间,该地址空间大小为4GB的线性虚拟空间,用户所看到和接触到的都是该虚拟地址,无法看到实际 ...

  8. linux查看进程的内存使用情况,[转]linux下查看进程内存使用情况

    动态查看一个进程的内存使用 1.top命令 top -d 1 -p pid [,pid ...] //设置为delay 1s,默认是delay 3s 如果想根据内存使用量进行排序,可以shift + ...

  9. Linux下进程间通信--共享内存:最快的进程间通信方式

    内存共享最新整理: Linux下进程间通信-共享内存 - 码到城攻共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式https://www.codecomeon.com/posts/109/ ...

  10. Linux下多线程编程互斥锁和条件变量的简单使用

    Linux下的多线程遵循POSIX线程接口,称为pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,链接时需要使用库libpthread.a.线程是进程的一个实体,是CPU ...

最新文章

  1. R语言使用GGally包的ggpairs函数可视化变量相关性分析图:包含散点图、密度图、柱状图、箱图等、并自定义数据点的大小
  2. 在内网服务器中获得真正的客户端ip的方法
  3. Struts2-2.了解struts.xml的查找顺序
  4. SpringBoot中将thymeleaf升级到3.0或以上版本
  5. 移动直播连麦实现思路:整体篇
  6. 队列判空_三分钟基础:什么是队列?
  7. SAP Fiori Elements 公开课第一单元概要介绍
  8. why my CREATE_OW will not generate OSSET entry in OB buffer
  9. 【git】如何在github上推送并部署自己的项目
  10. .NET 指南:包装异常
  11. 修改centos系统默认编辑器
  12. ENC28J60 驱动开发要点
  13. 操作键盘事件源码解析(常用的鼠标事件、 键盘事件对象之keyCode属性)
  14. JavaScript中解决Microsoft.XMLHTTP乱码的最简单方法
  15. 这个世界是怎么了?做商业软件的怎么越来越流氓了?
  16. 税务大比武网络攻防复习(完整版)
  17. shark恒破解笔记5-VB之rtcMsgBox
  18. a-table及相关组件的使用
  19. 京东API接口JD商品详情
  20. 纳税信用等级怎么划分 激励惩戒措施有哪些

热门文章

  1. 通过shell和redis来实现集群业务中日志的实时收集分析
  2. Linux--进程组 作业 会话 守护(精灵)进程
  3. Oracle Enterprise Linux 64-bit 下Oracle11g的监听配置改动及測试步骤
  4. vSphere 5.5 App HA学习-1、App HA概述
  5. Controller类中方法返回值详解
  6. 依赖注入的两种常用方式(构造器和Setter)与注入内容(装配数据)——Spring IOC/DI(三)
  7. android各版本对应的SDK level(包括android 10)
  8. Qt公有槽和私有槽的区别
  9. php打印日期,php打印日期
  10. mysql中字符串拼接函数_mysql 连接字符串操作(concat函数用法)