线程的终止与回收

原创 2012年03月27日 19:53:20

线程通常从启动函数中返回来终止自己,当调用pthread_exit退出线程或调用pthread_cancel取消线程时,线程在调用完每个清理过程后也将进入终止态。通过函数返回或pthread_exit调用正常终止的线程与通过取消调用终止的线程间的唯一外部区别是:被取消的线程其返回值总是PTHREAD_CANCELLED.

清理过程是由线程通过调用pthread_cleanup_push注册的,而且尚未通过调用pthread_cleanup_pop删除。

回收: 若使用detachstate属性建立线程,或调用pthread_detach分离线程,则当线程结束时将被立刻回收。若终止线程没有被分离,则它将一直处于终止态直到被分离(通过pthread_detach)或者被连接(通过pthread_join)。线程一旦被分离,就不能再访问它了。若线程已经被分离,则它立刻进入下一节--回收(回收将释放所有在线程终止时未释放的系统和进程资源,包括保存线程返回值的内存空间、堆栈、保存寄存器状态的内存空间等。其中一些资源可能已在线程终止时被释放,但必须记住:在线程终止后上述资源就不该被访问了。一旦线程被回收,线程ID就无效了,不能再连接它、取消它或执行其他任何操作。);否则,线程处于终止态,它还可以被其他线程调用pthread_join连接。就像UNIX中的进程已经结束但还没有被一个wait调用回收一样。有时这种线程被称为“僵”线程,因为即使它们已经死但还存在。僵线程可能会保留其运行时的大部分甚至所有资源,因此不应该让线程长时间处于这种状态。当创建不需要连接的线程时,应该使用detachstate属性建立线程使其自动分离。

终止线程将释放所有系统资源,但你必须释放由该线程占有的程序资源。调用 malloc或mmap分配的内存可能在任何时候由任何线程释放。互斥量、条件变量和信号灯可以由任何线程销毁,只要它们被解锁并没有线程等待。但是只有互斥量的主人能够解锁它。如果线程终止时还有加锁的互斥量,则该互斥量就不能被再次使用(因为不会被解锁)。

僵线程如何处理? 若没有进行分离的线程,使用pthread_join等待完成了 就可以解决了吗?

pthread_join调用返回时,被连接线程就已经被分离了(detached),再也不能连接该线程了,和自动分离一样的了,资源也就应该进行回收了。

取消一个线程是异步的,即,当pthread_cancel调用返回时,线程未尽已经被取消,可能仅仅被通知有一个针对它的未解决的取消请求。若需要知道线程在何时实际终止,就必须在取消它之后调用pthread_join与它连接。

linux下的线程的创建退出及回收

1.线程相关的概念: 程序:二进制程序放置在存储媒介中(硬盘,光盘,软盘等)以物理文件形式存在。 进程:程序被触发后,执行者的权限与属性,程序的程序代码与所需数据等都会被加载到内存中,操作系统...
  • qq_17308321
  • qq_17308321
  • 2015年11月05日 12:18
  • 2073

线程退出的几种方式和资源回收及设置线程属性

from:http://blog.chinaunix.net/uid-29924858-id-4603600.html  线程退出油多种方式,如return,pthread_exit,pthread...
  • dagefeijiqumeiguo
  • dagefeijiqumeiguo
  • 2017年03月18日 11:11
  • 1271

线程退出的几种方式和资源回收及设置线程属性

from:http://blog.chinaunix.net/uid-29924858-id-4603600.html  线程退出油多种方式,如return,pthread_exit,pthread...
  • dagefeijiqumeiguo
  • dagefeijiqumeiguo
  • 2017年03月18日 11:11
  • 1271

java线程池线程回收

注意: 一定要将线程回收,否则程序会一直等待!! 也可以关闭线程池,来退出程序,但是这样会导致新的任务无法执行!! 线程回收之后,有新的任务到来就会自动新建线程。 class Task impleme...
  • yh_zeng2
  • yh_zeng2
  • 2017年06月26日 00:22
  • 1647

linux线程资源回收方法

Linux系统中程序的线程资源是有限的,表现为对于一个程序其能同时运行的线程数是有限的。而默认的条件下,一个线程结束后,其对应的资源不会被释放,于是,如果在一个程序中,反复建立线程,而线程又默认的退出...
  • skyflying2012
  • skyflying2012
  • 2014年04月28日 17:25
  • 7983

Java线程是否会被垃圾回收

如果将线程启动后,然后线程变量置空,线程会怎么样? import java.lang.ref.WeakReference; public class TestThread {   publ...
  • kexi11089
  • kexi11089
  • 2014年01月21日 22:18
  • 2083

线程的状态及线程结束时候资源的回收

线程的状态及线程结束时候资源的回收           一句话总结:线程创建的时候默认处于joi...
  • baidu_33621692
  • baidu_33621692
  • 2017年01月10日 18:03
  • 1327

解决Java线程池任务执行完毕后线程回收问题

http://www.cnblogs.com/pengineer/p/5011965.html       对于经常使用第三方框架进行web开发的程序员来说,Java线程池理所应当是非常智能的,线程...
  • zdy0_2004
  • zdy0_2004
  • 2015年12月03日 18:06
  • 7915

linux下的线程的创建退出及回收

1.线程相关的概念: 程序:二进制程序放置在存储媒介中(硬盘,光盘,软盘等)以物理文件形式存在。 进程:程序被触发后,执行者的权限与属性,程序的程序代码与所需数据等都会被加载到内存中,操作系统...
  • qq_17308321
  • qq_17308321
  • 2015年11月05日 12:18
  • 2073

关于qt的线程结束

在Qt的线程创建。1、创建qt线程qt为我们创建线程进行了包装,调用qt的QThread类实例化就可以创建线程。 #inclide QThread thread; 就可以创建一个线程,此时线程创建完...
  • u010165367
  • u010165367
  • 2016年04月28日 16:04
  • 4117
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线程的终止与回收
举报原因:
原因补充:

(最多只允许输入30个字)