是否有必要调用pthread_join()

时间:2012-05-15 12:02:20

标签: c multithreading pthreads

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

7 个答案:

答案 0 :(得分:21)

pthread_join做了两件事:

  1. 等待线程完成。
  2. 清理与该线程关联的所有资源。
  3. 如果你在没有加入的情况下退出进程,那么(2)将由操作系统为你完成(虽然它不会进行线程取消清理,只是从轨道上取消线程),而(1)则不会。因此,您是否需要致电pthread_join取决于您是否需要(1)发生。

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

答案 1 :(得分:2)

退出时,您不需要加入,因为将自动清除所有其他线程和资源。这假设您确实希望在main退出时杀死所有线程。

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

所以,

  1. 如果您希望在程序完成之前完成所有线程,则从主线程加入可以使其工作。

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

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

答案 2 :(得分:1)

默认情况下,一个线程运行附加,这意味着它所需的资源在线程加入之前一直保持使用。

从你的描述来看,没有人,但线程本身需要线程的资源,所以你可以创建线程分离或在启动之前分离线程。

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

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

答案 3 :(得分:1)

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

但是,线程可能会分离,使它们不再可连接。因为线程在加入之前消耗系统资源,就像进程消耗资源直到它们的父调用wait()一样,所以你不打算连接的线程必须被分离,这是一个很好的编程习惯。

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

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

答案 4 :(得分:0)

如果您想确定您的主题已完成,请致电pthread_join

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

那就是说,你的main可以等待很长时间才能退出。但是,你怎么能确定它是否足够?

答案 5 :(得分:0)

是的,如果线程是可附加的,则必须使用pthread_join,否​​则它将创建一个Zombie线程。

同意上面的答案,只是在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).

答案 6 :(得分:-1)

如果你的主要结束你的应用程序结束而你的线程死了......所以你需要使用线程连接(或者使用fork)。