线程的终止与回收

来源:互联网 发布:iphone7屏幕录制软件 编辑:程序博客网 时间:2024/05/21 08:46

线程通常从启动函数中返回来终止自己,当调用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与它连接。
原创粉丝点击