pthread_join
有两个作用:
如果你没有使用pthread_join
而退出进程,操作系统将会为你执行(2)中的清理(虽然它不会进行线程取消清理,只是从轨道上摧毁线程),但(1)不会发生。因此,是否需要调用pthread_join
取决于是否需要完成(1)中的操作。
如果你不需要运行线程,那么像其他人所说,可以将其分离。分离的线程不能被加入(因此无法等待它完成),但如果它完成了,它的资源会自动释放。
如果线程是可附加的,则必须使用pthread_join,否则会创建僵尸线程。
同意上面的答案,只是分享一下pthread_join的man页面上的注释。
注释
After a successful call to pthread_join(), the caller is guaranteed that the target thread has terminated.
Joining with a thread that has previously been joined results in undefined behavior.
Failure to join with a thread that is joinable (i.e., one that is not detached), produces a "zombie thread". Avoid doing this, since each zombie thread consumes some system resources, and when
enough zombie threads have accumulated, it will no longer be possible to create new threads (or processes).
main
退出时杀死所有线程。pthread_attr_setdetachstate
将其设置为“分离”线程的属性。分离线程不能被加入,但它们也不需要被加入。main
返回,使用信号量或mutex+条件变量协调。默认情况下,pthreads库中的线程是可连接的。
然而,线程可以分离,使它们不再可连接。因为线程消耗系统资源直到被连接,就像进程消耗资源直到其父进程调用wait()一样,您不打算连接的线程必须被分离,这是一种良好的编程实践。
当然,一旦主程序退出,所有线程资源都将被释放。
如果我们未能做到这一点(分离),那么当线程终止时,它会产生线程等效的僵尸进程。除了浪费系统资源外,如果足够多的线程僵尸积累,我们将无法创建其他线程。
默认情况下,线程是附加运行的,这意味着它需要的资源会一直被占用,直到该线程被加入。
根据您的描述,除了线程本身,没有其他人需要该线程的资源,因此您可以创建分离的线程或在启动线程之前将其分离。
要在创建线程后分离线程,请调用pthread_detach()
。
无论如何,如果您想确保程序结束前所有线程都已关闭,您应该将线程附加并在离开主线程(程序)之前加入它们。
如果您想确保您的线程已经完成,您需要调用pthread_join
。
如果您不这样做,那么终止程序将会突然终止所有未完成的线程。
话虽如此,您的main
可以等待足够长的时间直到退出。但是,那么您怎么能确定它是足够的呢?