线程状态:windows
在一个线程的生存期内,能够在多种状态之间转换,不一样的操做系统能够实现不一样的线程模型,定义许多不一样的线程状态,每一个状态还能够包含多个子状态,但大致来讲,以下几种状态是通用的:api
1)就绪:参与调度,等待被执行,一旦被调度选中,当即开始执行并发
2)运行:占用CPU,正在运行中函数
3)休眠:暂不参与调度,等待特定事件发生spa
4)停止:已经运行完毕,等待回收线程资源操作系统
线程环境:线程
线程存在于进程之中,进程内全部全局资源对于内部每一个线程都是可见的。指针
进程内典型全局资源以下:对象
1)代码区:这意味着当前进程空间内全部的可见的函数代码,对于每一个线程来讲,也是可见的进程
2)静态存储区:全局变量,静态空间
3)动态存储区:堆空间
线程内典型的局部资源:
1)本地栈空间:存放本线程的函数调用栈,函数内部的局部变量等
2)部分寄存器变量:线程下一步要执行代码的指针偏移量
一个进程发起后,会首先生成一个缺省的线程,一般称这个线程为主线程,C/C++程序中,主线程就是经过main函数进入的线程,由主线程衍生的线程成为从线程,从线程也能够有本身的入口函数,至关于主线程的main函数,这个函数由用户指定。经过thread构造函数中传入函数指针实现,在指定线程入口函数时,也能够指定入口函数的参数。就像main函数有固定的格式要求同样,线程的入口函数也能够有固定的格式要求,参数一般都是void类型,返回类型根据协议的不一样也不一样,pthread中是void,winapi中是unsigned int,并且都是全局函数。
最多见的线程模型中,除主线程较为特殊以外,其余线程一旦被建立,相互之间就是对等关系,不存在隐含的层次关系。每一个进程可建立的最大线程数由具体实现决定。
不管在windows中仍是Posix中,主线程和子线程的默认关系是:不管子线程执行完毕与否,一旦主线程执行完毕退出,全部子线程执行都会终止。这时整个进程结束或僵死,部分线程保持一种终止执行但还未销毁的状态,而进程必须在其全部线程销毁后销毁,这时进程处于僵死状态。线程函数执行完毕退出,或以其余很是方式终止,线程进入终止态,可是为线程分配的系统资源不必定释放,可能在系统重启以前,一直都不能释放,终止态的线程,仍旧做为一个线程实体存在于操做系统中,何时销毁,取决于线程属性。在这种状况下,主线程和子线程一般定义如下两种关系:
一、可会合(joinable):这种关系下,主线程须要明确执行等待操做,在子线程结束后,主线程的等待操做执行完毕,子线程和主线程会合,这时主线程继续执行等待操做以后的下一步操做。主线程必须会合可会合的子线程。在主线程的线程函数内部调用子线程对象的wait函数实现,即便子线程可以在主线程以前执行完毕,进入终止态,也必须执行会合操做,不然,系统永远不会主动销毁线程,分配给该线程的系统资源也永远不会释放。
二、相分离(detached):表示子线程无需和主线程会合,也就是相分离的,这种状况下,子线程一旦进入终止状态,这种方式经常使用在线程数较多的状况下,有时让主线程逐个等待子线程结束,或者让主线程安排每一个子线程结束的等待顺序,是很困难或不可能的,因此在并发子线程较多的状况下,这种方式也会常用。
在任何一个时间点上,线程是可结合(joinable)或者是可分离的(detached),一个可结合的线程可以被其余线程回收资源和杀死,在被其余线程回收以前,它的存储器资源如栈,是不释放的,相反,一个分离的线程是不能被其余线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。
线程的分离状态决定一个线程以什么样的方式来终止本身,在默认的状况下,线程是非分离状态的,这种状况下,原有的线程等待建立的线程结束,只有当pthread_join函数返回时,建立的线程才算终止,释放本身占用的系统资源,而分离线程没有被其余的线程所等待,本身运行结束了,线程也就终止了,立刻释放系统资源。