回收子进程的资源
来源:互联网 发布:java编程实例300 编辑:程序博客网 时间:2024/05/16 10:28
在写网络服务器程序时可能需要实现多线程接收多个客户端的数据,可以在一个循环中调用accept等待client的connect,connect之后创建thread,这样其实有一个问题,服务器程序需要长期运行,长时间线程的创建,线程资源的回收就是一个问题。
Linux系统中程序的线程资源是有限的,表现为对于一个程序其能同时运行的线程数是有限的。而默认的条件下,一个线程结束后,其对应的资源不会被释放,于是,如果在一个程序中,反复建立线程,而线程又默认的退出,则最终线程资源耗尽,进程将不再能建立新的线程。
解决这个问题,有2种方式,系统自动释放线程资源,或者由另一个线程释放该线程资源。
另外,在Linux中,线程实际上是一种轻量级进程,只不过与主进程共享内存空间。当主进程结束后,程序退出,所建立的线程也会退出。
系统自动释放
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。
创建线程时指定
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
通过函数指定
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。
由另一个线程将该资源释放
- 1
- 2
- 3
- 1
- 2
- 3
pthread_join( t)等待线程t退出,并释放t线程所占用的资源。
pthread_join函数会阻塞等待指定线程退出,然后回收资源,这样就有同步的功能,使一个线程等待另一个线程退出,然后才继续运行,但是对于服务器程序如果主线程在新创建的线程工作时还需要做别的事情,这种方法不是很好,就需要使用方法一。
- 回收子进程的资源
- linux 进程的管理、子进程创建、进程资源的回收
- 僵尸态子进程的回收
- 异步回收fork出的子进程(僵尸进程)
- 异步回收fork出的子进程(僵尸进程)
- 异步回收fork出的子进程(僵尸进程)
- 异步回收fork出的子进程(僵尸进程)
- 异步回收fork出的子进程(僵尸进程)
- 异步回收fork出的子进程(僵尸进程)
- linux进程内核资源回收
- linux 信号 回收子进程
- Android系统回收资源时进程被杀的优先级
- 【IO进程】Linux C中回收线程资源的方法
- 【C语言】【unix c】进程资源的回收
- 操作系统 - 程序不会按照特定的顺序回收子进程
- 进程管理--回收僵尸态子进程
- 父进程wait回收子进程
- fork 后子进程copy父进程的什么资源
- gcc编译器实验
- iptables知识点
- bzoj3667: Rabin-Miller算法
- 浅谈ASP.NET MVC
- 【Spring学习35】Spring事务(5):编程式事务
- 回收子进程的资源
- bzoj4802: 欧拉函数
- Class.forName的作用以及为什么要用它【转】
- winhex修改JPG文件编码
- 堆栈的区别,很详细
- Android中软键盘的引出的问题,所做的小Demo
- 【Spring学习36】Spring事务(6):声明式事务(集合Mybatis)
- 万圣节派对
- bzoj2724: [Violet 6]蒲公英