C 需要调用pthread_join()吗

C 需要调用pthread_join()吗,c,multithreading,pthreads,C,Multithreading,Pthreads,我从main()创建了100多个线程,所以我只想知道在退出main()之前是否需要调用pthread\u join()。 另外,我不需要这些线程生成的数据,基本上,所有线程都独立于main()和其他线程执行某些工作。如果您的main端,那么您的应用程序将结束,线程将死亡。。。因此,您确实需要使用线程连接(或者改用fork)。如果您想确保您的线程已经实际完成,您需要调用pthread\u-join 如果没有,那么终止程序将突然终止所有未完成的线程 也就是说,您的main可以等待足够长的时间,直到退

我从main()创建了100多个线程,所以我只想知道在退出main()之前是否需要调用
pthread\u join()

另外,我不需要这些线程生成的数据,基本上,所有线程都独立于main()和其他线程执行某些工作。

如果您的main端,那么您的应用程序将结束,线程将死亡。。。因此,您确实需要使用线程连接(或者改用fork)。

如果您想确保您的线程已经实际完成,您需要调用
pthread\u-join

如果没有,那么终止程序将突然终止所有未完成的线程


也就是说,您的
main
可以等待足够长的时间,直到退出。但是,您如何才能确保它是令人窒息的呢?

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

如果不需要与线程联接,可以在创建线程之前使用属性上的
pthread\u attr\u setdetachstate
将其创建为“分离”线程。无法连接分离的线程,但也不需要连接它们

所以

  • 如果您希望在程序完成之前完成所有线程,那么从主线程连接可以实现这一点

  • 或者,您可以创建分离的线程,并在所有线程退出后从
    main
    返回,使用信号量或mutex+条件变量进行协调

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


  • 默认情况下,线程会附加运行,这意味着它所需的资源会一直保持使用状态,直到线程被连接

    根据您的描述,没有一个线程本身需要该线程的资源,因此您可以在启动之前创建分离的线程或分离该线程

    要在创建线程后分离线程,请调用
    pthread\u detach()


    无论如何,如果要确保程序结束前所有线程都已结束,则应在离开主线程(程序)之前运行附加的线程并将其连接起来。

    pthread\u join
    执行两项操作:

  • 等待线程完成
  • 清理与线程关联的所有资源
  • 如果您在未加入的情况下退出进程,那么(2)将由操作系统为您完成(尽管它不会执行线程取消清理,只需将线程从动态观察中核化即可),而(1)不会。因此,是否需要调用
    pthread\u join
    取决于是否需要(1)


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

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

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

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


    如果我们没有做到这一点(分离),那么,当线程终止时,它将生成与僵尸进程等价的线程。除了浪费系统资源外,如果累积了足够多的线程僵尸,我们将无法创建额外的线程。

    是的,如果线程是可附加的,那么必须使用pthread_join,否则它将创建僵尸线程

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

    注释


    请注意,在案例(2)中,您的协调可以确保在线程发布信号量或condvar之前,在线程完成所有操作之前不会退出。对于所有实际用途来说,这应该足够好了,但实际上它不能确保在线程退出之前不会退出,因为它们在执行通知主线程发生了有趣事情的代码后的某个未指定时间退出。谢谢您的回复。。所以如果我理解正确的话。。如果主线程退出,我的所有线程都将被杀死。。因此,为了避免这种情况,我必须调用pthread_join()或pthread_detach()。。。对于我的场景,因为我不需要main()一直等待所有线程完成,我只需调用pthread_detach()并退出我的main(),最后操作系统将安全地释放所有线程在完成时使用的所有资源???@user1271244:不。如果你分离线程,它们将在进程退出时被杀死,这就是我说的原因“如果你不需要线程运行,你也可以分离它”。如果你需要它运行,你必须加入它。
       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).