线程的状态,直接决定了我们的线程会以什么样的方式释放资源(是等待另外线程的回收,还是直接由系统释放)
想要理解这项事情,首先需要我们对 僵尸进程 的概念进行回顾。
僵尸进程 概念回顾
进程一般分为两个部分,自有资源部分和操作系统统计数据部分(PCB)
而我们知道,在 Unix 系统中,存在父子进程关系,父进程承担着子进程的资源回收任务。
而父进程如果不使用 waitpid 函数取得子进程的终止状态的话,那么,在完成工作任务的子进程上,自有资源部分已经清空,但是操作系统的统计数据部分仍然保留,换而言之,始终有一部分资源,没有办法释放(这种情况,就是僵尸进程)
线程的可结合状态
现在,我们将目光转回到线程,线程有两种状态,一种叫做“可结合状态",一种叫做“分离状态"。
在可结合状态中,线程资源的回收任务,也和进程类似,需要我们使用 pthread_join 函数取得它的终止状态,然后才可以回收资源。
但是,我们要注意到的情况是,如果等待的线程不终止, pthread_join 函数就会一直阻塞我们主线程的工作。
这样的做法,非常适用于有顺序要求的任务,比如数据库中的数据项读写。
不过同时,在很多时候,它也违背了线程设计的初衷:让我们的应用程序进程,可以在一个时间段内,分别处理不同的任务。
所以,也就有了线程的分离状态
线程的分离状态
线程的分离状态,则是调用 pthread_detach 之后的结果,它让我们的线程在完成工作以后,资源自动被系统回收。
这样,对于很多独立进行,与主任务不相关的线程而言,非常友好。