线程的结合状态与分离状态
在任何时间点上,线程都是 可结合的(Joinable) 或者 分离的(Detached)。
- 如果线程是 结合状态,那么此线程可以被其他线程杀死并回收资源;在被其他线程回收之前,它的存储器资源(例如栈)是不释放的;
- 如果线程是 分离状态,那么此线程不能被其他线程终结并回收资源;他的存储器资源在它终止时由系统自动回收;
由上可知,线程的分离状态决定了决定了线程以何种方式终结自己。
默认情况下,线程是 结合状态,只有当主线程中的 pthread_join()
函数返回时,该线程的资源才被回收。此时,才能人为该线程终止了。
如果线程是 分离状态,线程自己运行结束,线程资源马上会被系统回收,线程终止。
如果我们创建线程时不需要了解线程的终止状态,可以把线程设置为 分离状态。
线程的状态操作函数
pthread_attr_getdetachstate()
:可以获取线程的状态属性;
pthread_attr_setdetachstate()
:可以设置线程的状态属性;
可以设置的属性值为:
PTHREAD_CREATE_DETACHED
:表示以分离状态启动线程;PTHREAD_CREATE_JOINABLE
:表示以结合状态启动线程;
注意: 如果一个线程是分离状态,而它运行的又特别快,它很可能在 pthread_create
函数返回之前就终止了;它终止以后该线程号和资源就移交给其他的线程使用,这样调用 pthread_create
的线程就得到了错误的线程号。避免该情况的措施之一就是采取同步措施,最简单的方法之一就是该线程里面调用 pthread_cond_timewait
函数,让线程休眠一会儿,以流出足够的时间让函数 pthread_create
返回。但是,不能使用诸如 wait()
之类的函数,因为这是进程级别的函数,它会造成整个进程的休眠,并不能解决线程同步的问题。