线程状态
在一个线程的生存期内,可以在多种状态之间转换。不同操作系统可以实现不同的线程模型,定义许多不同的线程状态,每个状
态还可以包含多个子状态。但大体说来,如下几种状态是通用的:
就绪:参与调度,等待被执行。一旦被调度选中,立即开始执行。
运行:占用CPU,正在运行中。
休眠:暂不参与调度,等待特定事件发生。
中止:已经运行完毕,等待回收线程资源(要注意,这个很容易误解,后面解释)。
线程环境
线程存在于进程之中。进程内所有全局资源对于内部每个线程均是可见的。
进程内典型全局资源有如下几种:
代码区。这意味着当前进程空间内所有可见的函数代码,对于每个线程来说也是可见的。
静态存储区。全局变量。静态变量。
动态存储区。也就是堆空间。
线程内典型的局部资源有:
本地栈空间。存放本线程的函数调用栈,函数内部的局部变量等。
部分寄存器变量。例如本线程下一步要执行代码的指针偏移量。
可会合(joinable)。这种关系下,主线程需要明确执行等待操作。在子线程结束后,主线程的等待操作执行完毕,子线程
和主线程会合。这时主线程继续执行等待操作之后的下一步操作。主线程必须会合可会合的子线程,Thread类中,这个操作通过
在主线程的线程函数内部调用子线程对象的wait()函数实现。这也就是上面加上三个wait()调用后显示正确的原因。必须强调的
是,即使子线程能够在主线程之前执行完毕,进入终止态,也必需显示执行会合操作,否则,系统永远不会主动销毁线程,分配
给该线程的系统资源(线程id或句柄,线程管理相关的系统资源)也永远不会释放。
相分离(detached)。顾名思义,这表示子线程无需和主线程会合,也就是相分离的。这种情况下,子线程一旦进入终止态
,系统立即销毁线程,回收资源。无需在主线程内调用wait()实现会合。Thread类中,调用detach()使线程进入detached状态。
这种方式常用在线程数较多的情况,有时让主线程逐个等待子线程结束,或者让主线程安排每个子线程结束的等待顺序,是很困
难或者不可能的。所以在并发子线程较多的情况下,这种方式也会经常使用。
缺省情况下,创建的线程都是可会合的。可会合的线程可以通过调用detach()方法变成相分离的线程。但反向则不行。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cute810326/archive/2009/08/06/4417976.aspx