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).
7条答案
按热度按时间vof42yt11#
默认情况下,线程运行附加,这意味着它所需要的资源一直在使用,直到线程被加入。
根据你的描述,除了线程本身之外,没有人需要线程的资源,所以你可以创建一个分离的线程,或者在启动线程之前分离线程。
要在创建线程后分离线程,请调用
pthread_detach()
。无论如何,如果你想确保所有的线程都在程序结束前消失,你应该运行附加的线程,并在离开主线程(程序)之前加入它们。
wgxvkvu92#
如果你想确保你的线程已经完成,你需要调用
pthread_join
。如果不这样做,那么终止程序将突然终止所有未完成的线程。
也就是说,您的
main
可以等待足够长的时间,直到它退出。但是,你怎么能确定它是足够的呢?fdbelqdn3#
如果你的主程序结束了,你的应用程序结束了,你的线程死了...所以你需要使用线程连接(或者使用fork)。
4szc88ey4#
pthread_join
做两件事:1.等待线程完成。
1.清除与线程关联的所有资源。
如果你没有加入就退出进程,那么(2)操作系统会为你做(尽管它不会做线程取消清理,只是从轨道上核掉线程),(1)不会。所以你是否需要调用
pthread_join
取决于你是否需要(1)发生。如果你不需要线程运行,那么就像其他人说的那样,你可以分离它。一个分离的线程不能被加入(所以你不能等待它完成),但是如果它完成了,它的资源会被自动释放。
f87krz0w5#
是的,如果线程是可附加的,那么
pthread_join
是必须的,否则它会创建一个僵尸线程。我同意上面的答案,只是分享了
pthread_join
手册页的一个注解。备注:
6tr1vspr6#
退出时,您不需要加入,因为所有其他线程和资源将自动清除。这假设您实际上希望在
main
退出时杀死所有线程。如果你不需要加入一个线程,你可以在创建线程之前通过在属性上使用
pthread_attr_setdetachstate
将它创建为一个“分离”线程。分离的线程不能被联接,但它们也不需要被联接。所以,
1.如果您希望所有线程在程序完成之前完成,则从主线程加入可以实现这一点。
1.作为替代方案,您可以将线程创建为分离的,并在所有线程退出后从
main
返回,使用信号量或mutex+条件变量进行协调。1.如果你不需要完成所有的线程,只需从main返回。所有其他线程都将被销毁。您还可以将线程创建为分离线程,这样可以减少资源消耗。
7nbnzgx97#
默认情况下,pthreads库中的线程被创建为可接合的。
但是,线程可能会分离,从而使它们不再可接合。因为线程在加入之前会消耗系统资源,就像进程在其父进程调用wait()之前会消耗资源一样,所以您不打算加入的线程必须被分离,这是一个很好的编程实践。
当然,一旦主例程退出,所有线程资源都将被释放。
如果我们不能做到这一点(分离),那么,当线程终止时,它会产生一个相当于僵尸进程的线程。除了浪费系统资源之外,如果有足够的线程僵尸积累,我们将无法创建额外的线程。