在写网络服务器程序时可能需要实现多线程接收多个客户端的数据,我实现方式比较傻,死循环等待client的connect,connect之后创建thread,这样其实有一个问题,服务器程序需要长期运行,长时间线程的创建,线程资源的回收就是一个问题。

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线程所占用的资源。

pthread_join函数会阻塞等待指定线程退出,然后回收资源,这样就有同步的功能,使一个线程等待另一个线程退出,然后才继续运行,但是对于服务器程序如果主线程在新创建的线程工作时还需要做别的事情,这种方法不是很好,就需要使用方法一

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.

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

pthread多线程资源回收策略相关推荐

  1. K8S的资源回收策略

    1.ownreference: 一些 Kubernetes 对象是其它一些的 Owner.例如,一个 ReplicaSet 是一组 Pod 的 Owner.具有 Owner 的对象被称为是 Owner ...

  2. pthread多线程编程的学习小结

    pthread多线程编程的学习小结 pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写 程序员必上的开发者服务平台 -- DevStore p ...

  3. Linux线程退出、资源回收、资源清理的方法

    首先说明线程中要回收哪些资源,理解清楚了这点之后在思考资源回收的问题. 1.子线程创建时从父线程copy出来的栈内存; 线程退出有多种方式,如return,pthread_exit,pthread_c ...

  4. clone的fork与pthread_create创建线程有何不同pthread多线程编程的学习小结(转)

    进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中被抽 象成各种数据对象:进程控制块.虚存空间.文件系统,文件I/O.信号处理函数.所以创建一个进程的 过程就是这 ...

  5. 《深入理解JVM.2nd》笔记(三):垃圾收集器与垃圾回收策略

    文章目录 概述 对象已死吗 引用计数算法 可达性分析算法 再谈引用 finalize():生存还是死亡 回收方法区 垃圾收集算法 标记-清除算法 复制算法 标记-整理算法 分代收集算法 HotSpot ...

  6. 垃圾回收策略和算法,看这篇就够了

    作者 | Craig无忌 来源 | 程序员大帝(ID:kingcoding) 前言 回收,旧手机,旧冰箱,旧空调,旧洗衣机,电瓶车摩托车,自行车,报纸,塑料...... 还记得小时候,我喝完的饮料瓶子 ...

  7. clone的fork与pthread_create创建线程有何不同pthread多线程编程的学习小结

    进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中被抽 象成各种数据对象:进程控制块.虚存空间.文件系统,文件I/O.信号处理函数.所以创建一个进程的 过程就是这 ...

  8. JVM学习四:垃圾收集器与内存回收策略

    一.经典垃圾收集器 如果垃圾收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的实践者.<Java虚拟机规范>对于垃圾收集器的实现没有任何规定. 这里介绍的经典垃圾收集器," ...

  9. 线程退出和线程资源回收问题

    最近项目中遇到循环8M的内存泄漏问题,排查后发现是由于特殊场景下使子线程异常退出,主线程发现子线程退出便再次创建线程,此时未回收退出线程的资源造成了内存泄漏,导致数据库宿主机oom,此问题不仅导致内存 ...

最新文章

  1. PHP设计模式(4)命令链模式
  2. 云炬Android开发教程 Android studio的详细安装步骤
  3. Intellij IDEA 默认打开上次项目设置与取消设置
  4. JQuery-学习笔记06【高级——JQuery事件绑定和切换】
  5. OracleDB的数据库名,实例名,服务名,数据库域名,全局数据库名的简单介绍
  6. √2是个无理数,没有尽头,为什么边长为1的直角三角形可以画出来? 是悖论吗?...
  7. python应用体系_python-大型django应用程序体系结构
  8. linux环境内存查询指令,帮助你检查Linux系统内存及其使用情况的命令
  9. c语言实验一的错误,C语言实验(三)
  10. 图片相框展示的设计与实现
  11. 多线程,多进程实例对比
  12. lm opencv 算法_Levenberg–Marquardt算法学习(和matlab的LM算法对比)
  13. Navicat Premium for Mac 11.1.8 免费中文破解版下载
  14. Windows xp Ms08067漏洞复现
  15. chcp 437>nul graftabl 936>nul
  16. python求一元三次方程的根_方程的计算机处理924_Fortran
  17. 修改内存卡里linux系统文件怎么恢复,EMMC转SD卡做成内存卡恢复数据教程
  18. 笑一笑-道高一尺魔高一丈
  19. 英语口语8000句-生病、受伤时
  20. windows无法连接到打印机?三个方法连接打印机(Win10系统)

热门文章

  1. 感叹号在Java啥意思_感叹号暗示什么意思
  2. BZOJ 2085 Poi2010 Hamsters Hash+倍增Floyd
  3. 记一次PHP并发性能调优实战 -- 性能提升104%
  4. keystone -- An unexpected error prevented the server from fulfilling your request. 错误
  5. php mysql签到系统_php实现签到功能
  6. 网站如何启用https
  7. LXC 和 LXD 容器总结
  8. 9.java程序员必知必会类库之加密库
  9. JPM Coin 三部曲 (上) - 深入理解摩根币的运作
  10. tmp ubuntu 自动删除吗_ubuntu 自动清理/tmp目录