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有两种状态joinable状态和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失败。

不知是否因为自己,先对要创建的线程做了以下属性设定,
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

然后又在线程函数中使用
pthread_detach(pthread_self());

两段代码作用有冲突。

===============================================================================

pthread_detach(threadid)和pthread_detach(pthread_self())的区别应该是调用他们的线程不同,没其他区别。

pthread_detach(threadid)函数的功能是使线程ID为threadid的线程处于分离状态,一旦线程处于分离状态,该线程终止时底层资源立即被回收;否则终止子线程的状态会一直保存(占用系统资源)直到主线程调用pthread_join(threadid,NULL)获取线程的退出状态。
通常是主线程使用pthread_create()创建子线程以后,一般可以调用pthread_detach(threadid)分离刚刚创建的子线程,这里的threadid是指子线程的threadid;如此以来,该子线程止时底层资源立即被回收;
被创建的子线程也可以自己分离自己,子线程调用pthread_detach(pthread_self())就是分离自己,因为pthread_self()这个函数返回的就是自己本身的线程ID。

转载于:https://www.cnblogs.com/huty/p/8518632.html

【Linux开发】彻底释放Linux线程的资源相关推荐

  1. 嵌入式Linux开发教程:Linux常见命令(上篇)

    摘要:这是对周立功编著的<嵌入式Linux开发教程>的第7期连载.本期刊载内容有关LinuxLinux常见命令中的导航命令.目录命令和文件命令.下一期将连载网络操作命令.安装卸载文件系统等 ...

  2. 总结如何从Linux开发工程师到Linux后台开发工程师再到Linux高级互联网架构师

    前言: 小编也是从事c方面10多年的工作经验.今天跟大家分享一下我总结出来的一系列 C/C Linux后台服务器开发的学习路线.从Linux开发工程师-Linux后台开发工程师-Linux高级互联网架 ...

  3. node linux cache补释放,linux下释放cache内存

    细心的朋友会注意到,当你在linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching.这个问题,貌似有不少人在问,不过都没有看到有什么很好解决的办法 ...

  4. linux开发板测试,Linux 开发板常规测试

    [正点原子]I.MX6U用户快速体验V1.2.pdf 1. LED 与蜂鸣器测试 LED 测试 echo none > /sys/class/leds/sys-led/trigger # 改变 ...

  5. linux开发 stc_在Linux上快速搭建8051开发环境

    在Linux上快速搭建8051开发环境(2018-7-2) 0. 写在开始之前 实验操作系统环境: Ubuntu 16.04 编译器: sdcc SDCC - Small Device C Compi ...

  6. 通过电脑给linux开发板联网,Linux 开发板通过网线连电脑上网的方法和配置步骤...

    Linux 开发板通过网线连电脑上网的方法和配置步骤 调试 Linux 开发板时, 如果需要开发板上网, 可以用一根网线将开发板网口和笔记本的网口连接到一起, 然后笔记本通过 Wi-Fi 网上, 开发 ...

  7. Linux开发入门笔记——Linux使用基础

    一直对Linux十分向往,因为听说大佬们都是使用Linux来进行开发的.使用Linux是区别会计算机和普通人的一个关键的依据.所以当我准备开始学Linux的时候就有种升级技能,获得成就的感觉. 当然现 ...

  8. Linux读写锁释放,Linux读写锁的使用

    读写锁是用来解决读者写者问题的,读操作可以共享,写操作是排它的,读可以有多个在读,写只有唯一个在写,写的时候不允许读. 具有强读者同步和强写者同步两种形式: 强读者同步:当写者没有进行写操作时,读者就 ...

  9. linux 开发组织模式,Linux内核发布模式与开发组织模式(1)

    Linux内核社区经历20多年的发展,逐渐形成了一套完善的开发模式.作为想要加入社区进行开发的人来说,当然必须熟悉下这套模式啦,其中最重要的两点是: 内核发布模式 内核开发组织模式 本文将对第一点进行 ...

  10. linux 开发板模拟u盘,linux 开发板(Linux USB Gadget) 模拟u盘

    前几天,搞了 hid设备,通过usb hid设备和windows进行通信.现在开始搞这个 mass storge 首先说明 环境:linux版本:3.15        使用开发板:SAMa5d3   ...

最新文章

  1. 卷积神经网络原理图文详解
  2. 由MySql漏洞导致电脑被入侵(特征为新增加名为piress的帐户)
  3. e5cc温控仪通讯参数设定_产品介绍||DeltaWiFi通讯型多功能电表DPMC520W
  4. 锐捷服务器虚拟化技术_用它!锐捷“双擎”云桌面助力检察机关统一业务应用系统2.0上线...
  5. java mysql insert id_MySQL和Java-获取最后插入值的ID(JDBC)[重复]
  6. android selector(转)
  7. LINUX tar解压到指定目录
  8. python搭建http服务_Python搭建HTTP服务过程图解
  9. javascript上传文件到腾讯云COS
  10. Ubuntu16.04 ftp服务器安装+配置
  11. Main concerns of fDSST tracker
  12. pandas pandas中stack()与unstack()函数用法
  13. SSM+mysql+微信小程序网易云音乐设计与实现 毕业设计-附源码261620
  14. IC 产品的质量与可靠性测试
  15. 什么是静态测试、动态测试、黑盒测试、白盒测试、α测试、β测试?
  16. Mac上使用USB共享网络
  17. 洛谷P1080 [NOIP2012 提高组] 国王游戏(贪心,高精度)
  18. 【微服务】SpringAMQP
  19. 舆情监测意思及监测工作流程详介
  20. Axure 9 实战案例,中继器的应用 2,列表的交替色和悬停色

热门文章

  1. python常用模块实例_python中常用的各种数据库操作模块和连接实例
  2. Altair HW FEKO+WinProp 2020中文版
  3. 函数动态传参详细,作用域和名称空间,global和nonlocal
  4. Django的学习需要掌握的一些基础和初步搭建自己的框架
  5. vue-自定义过滤器--时间
  6. Android开发中Handler的经典总结
  7. NumericUpDown 控件输入限制小数位
  8. 读书笔记:《图解HTTP》第一章 网络基础
  9. 区块链组织-超级账本(Hyperledger)的简介
  10. 开发笔记7 | 部署 Go 应用程序到阿里云 ECS