是否有必要调用pthread_join()

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

pthread_join做了两件事:

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

如果你在没有加入的情况下退出进程,那么(2)将由操作系统为你完成(虽然它不会进行线程取消清理,只是从轨道上取消线程),而(1)则不会。 所以你是否需要调用pthread_join取决于你是否需要(1)发生。

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

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

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

所以,

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

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

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

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

从你的描述开始,除了线程本身需要线程的资源之外,你可以创建线程分离或在启动之前分离线程。

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

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

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

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

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

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

如果你想确定你的线程已经完成,你想调用pthread_join

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

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

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