【IO进程】Linux C中回收线程资源的方法
2017-04-10 18:21
323 查看
版权声明:转自http://blog.csdn.net/skyflying2012/article/details/24655751
Linux系统中程序的线程资源是有限的,表现为对于一个程序其能同时运行的线程数是有限的。而默认的条件下,一个线程结束后,其对应的资源不会被释放,于是,如果在一个程序中,反复建立线程,而线程又默认的退出,则最终线程资源耗尽,进程将不再能建立新的线程。
解决这个问题,有2种方式,系统自动释放线程资源,或者由另一个线程释放该线程资源。
另外,在Linux中,线程实际上是一种轻量级进程,只不过与主进程共享内存空间。当主进程结束后,程序退出,所建立的线程也会退出。
若是unjoinable状态的线程,这些资源在线程函数退出时或pthread_exit时自动会被释放。
unjoinable属性可以在pthread_create时指定,或在线程创建后在线程中pthread_detach自己,如:pthread_detach(pthread_self()),将状态改为unjoinable状态,确保资源的释放。或者将线程置为joinable,然后适时调用pthread_join。
这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_join( t)等待线程t退出,并释放t线程所占用的资源。
pthread_join函数会阻塞等待指定线程退出,然后回收资源,这样就有同步的功能,使一个线程等待另一个线程退出,然后才继续运行,但是对于服务器程序如果主线程在新创建的线程工作时还需要做别的事情,这种方法不是很好,就需要使用方法一。
问题描述
在写网络服务器程序时可能需要实现多线程接收多个客户端的数据,可以在一个循环中调用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。
创建线程时指定
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_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_t t; pthread_create( NULL, NULL, GetAndSaveAuthviewSDRStub, (void*)lp); pthread_join( t);
pthread_join( t)等待线程t退出,并释放t线程所占用的资源。
pthread_join函数会阻塞等待指定线程退出,然后回收资源,这样就有同步的功能,使一个线程等待另一个线程退出,然后才继续运行,但是对于服务器程序如果主线程在新创建的线程工作时还需要做别的事情,这种方法不是很好,就需要使用方法一。
相关文章推荐
- [c/c++] 一个进程有多个线程,用什么方法让主线程不退出更好,占用资源最少,效率最高?
- [c/c++] 一个进程有多个线程,用什么方法让主线程不退出更好,要求占用资源最少,效率最高
- 进程线程通信方法总结
- 同一进程下的线程可以共享哪些资源
- linux线程资源回收的问题(虚拟内存)
- linux线程资源回收方法
- linux 多进程并发服务__关于子进程回收的方法
- 线程共享进程的那些资源?
- VC下提前注入进程的一些方法2——远线程带参数
- 线程结束时候资源的回收
- 同一进程中的线程究竟共享哪些资源
- Python异步非阻塞IO多路复用Select/Poll/Epoll使用,线程,进程,协程
- IIS进程回收导致定时器失效的解决方法(CMD命令)
- 同一进程中的线程究竟共享哪些资源 [转]
- 快速定位性能瓶颈,检查出所有资源(CPU、内存、磁盘IO等)的利用率(utilization)、饱和度(saturation)和错误(error)度量,即USE方法
- 进程、线程、协程、异步、非堵塞IO,多路复用详解
- Linux下获取占用CPU内存资源最多的10个进程的方法
- Linux下获取线程TID的方法——gettid() 获取进程 getpid()
- 1线程概念:线程和进程之间的关系,线程间可共享资源,线程间非共享资源,线程的优缺点
- commns-io jar包中的方法及合并流及线程