21

我从 main() 创建了 100 多个线程,所以我只想知道pthread_join()在退出 main() 之前是否需要调用。另外,我不需要这些线程生成的数据,基本上,所有线程都在做一些独立于 main() 和其他线程的工作。

4

7 回答 7

36

pthread_join做两件事:

  1. 等待线程完成。
  2. 清理与线程关联的所有资源。

如果您在没有加入的情况下退出进程,那么 (2) 将由操作系统为您完成(尽管它不会执行线程取消清理,只是从轨道中删除线程),并且 (1) 不会。所以你是否需要打电话pthread_join取决于你是否需要(1)发生。

如果您不需要线程运行,那么正如其他人所说,您也可以将其分离。无法加入分离的线程(因此您不能等待其完成),但如果它完成,它的资源会自动释放。

于 2012-05-15T12:11:06.650 回答
5

是的,如果线程是可附加的,那么 pthread_join 是必须的,否则它会创建一个僵尸线程。

同意上面的答案,只是分享 pthread_join 手册页中的注释。

笔记

   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).
于 2019-05-09T09:40:45.767 回答
3

当你退出时,你不需要加入,因为所有其他线程和资源都会被自动清理。这假设您实际上希望在main退出时杀死所有线程。

如果您不需要加入线程,您可以pthread_attr_setdetachstate在创建线程之前使用属性将其创建为“分离”线程。分离的线程无法连接,但它们也不需要连接。

所以,

  1. 如果您希望所有线程在程序完成之前完成,那么从主线程加入即可完成这项工作。

  2. 作为替代方案,您可以将线程创建为分离的,并main在所有线程退出后返回,使用信号量或互斥+条件变量进行协调。

  3. 如果您不需要完成所有线程,只需从 main 返回。所有其他线程将被销毁。您还可以将线程创建为分离线程,这可以减少资源消耗。

于 2012-05-15T12:05:55.640 回答
2

默认情况下,pthreads 库中的线程被创建为可连接的。

但是,线程可能会分离,从而使它们不再可连接。因为线程在加入之前消耗系统资源,就像进程在其父调用 wait() 之前消耗资源一样,您不打算加入的线程必须分离,这是一种良好的编程习惯。

当然,一旦主程序退出,所有线程资源都会被释放。

如果我们不这样做(分离),那么当线程终止时,它会产生相当于僵尸进程的线程。除了浪费系统资源外,如果积累了足够多的线程僵尸,我们将无法创建额外的线程。

于 2017-10-08T17:01:31.597 回答
1

默认情况下,线程运行附加,这意味着它需要的资源一直在使用,直到线程加入。

根据您的描述,没有人,但线程本身需要线程的资源,因此您可能会在启动线程之前创建分离的线程或分离线程。

在创建调用后分离线程pthread_detach()

无论如何,如果您想确保在程序结束之前所有线程都消失了,您应该在离开主线程(程序)之前运行附加的线程并加入它们。

于 2012-05-15T12:07:43.363 回答
0

如果你想确保你的线程已经真正完成,你想调用pthread_join.

如果你不这样做,那么终止你的程序将突然终止所有未完成的线程。

也就是说,您main可以等待足够长的时间直到它退出。但是,你怎么能确定它是足够的呢?

于 2012-05-15T12:05:00.073 回答
-1

如果您的主要结束您的应用程序结束并且您的线程死亡......所以您确实需要使用线程连接(或使用 fork 代替)。

于 2012-05-15T12:03:57.180 回答