POSIX 线程分离、结合

Posted by ysd on August 25, 2016

在任何一个时间点上,线程是可结合的( joinable ),或者是分离的( detached)。 一个可结合的线程能够被其他线程收回其资源和杀死;在被其他线程回收之前,它的存储器资源(如栈)是不释放的。 相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。

如果线程处于 joinable 状态,则只能只能被创建他的线程等待终止。 在Linux平台默认情况下,虽然各个线程之间是相互独立的,一个线程的终止不会去通知或影响其他的线程。 但是已经终止的线程的资源并不会随着线程的终止而得到释放, 我们需要调用 pthread_join() 来获得另一个线程的终止状态并且释放该线程所占的资源。 (说明:线程处于 joinable 状态下)

这里要注意的一点是,如果设置一个线程为分离线程,而这个线程运行又非常快, 它很可能在pthread_create函数返回之前就终止了,它终止以后就可能将线程号和系统资源移交给其他的线程使用, 这样调用pthread_create的线程就得到了错误的线程号。 要避免这种情况可以采取一定的同步措施, 最简单的方法之一是可以在被创建的线程里调用pthread_cond_timewait函数,让这个线程等待一会儿, 留出足够的时间让函数pthread_create返回。

如果不关心一个线程的结束状态,那么也可以将一个线程设置为 detached 状态,从而让操作系统在该线程结束时来回收它所占的资源。 将一个线程设置为 detached 状态可以通过两种方式来实现。一种是调用 pthread_detach() 函数