是否有必要调用pthread_join()
我从main()创建了100多个线程,所以我只想知道在退出main()之前需要调用pthread_join()。 此外,我不需要这些线程生成的数据,基本上所有线程都在做一些独立于main()和其他线程的工作。
pthread_join
做了两件事:
- 等待线程完成。
- 清理与线程关联的所有资源。
如果你在没有加入的情况下退出进程,那么(2)将由操作系统为你完成(虽然它不会进行线程取消清理,只是从轨道上取消线程),而(1)则不会。 所以你是否需要调用pthread_join
取决于你是否需要(1)发生。
如果您不需要运行该线程,那么正如其他人所说的那样,您也可以将其分离。 分离的线程无法连接(因此您无法等待其完成),但如果资源完成,则会自动释放其资源。
退出时,您不需要加入,因为将自动清除所有其他线程和资源。 这假设您确实希望在main
退出时杀死所有线程。
如果您不需要连接线程,可以在创建线程之前使用属性上的pthread_attr_setdetachstate
将其创建为“分离”线程。 分离的线程无法连接,但它们也不需要连接。
所以,
-
如果您希望在程序完成之前完成所有线程,则从主线程加入会使其工作。
-
作为替代方案,您可以将线程创建为分离,并在所有线程退出后从
main
返回,使用信号量或互斥+条件变量进行协调。 -
如果您不需要完成所有线程,只需从main返回。 所有其他线程将被销毁。 您还可以将线程创建为分离线程,这可以减少资源消耗。
默认情况下,一个线程运行附加,这意味着它所需的资源将保持使用,直到线程被连接。
从你的描述开始,除了线程本身需要线程的资源之外,你可以创建线程分离或在启动之前分离线程。
要在创建线程后分离线程,请调用pthread_detach()
。
无论如何,如果你想在程序结束之前确保所有线程都已消失,你应该运行附加的线程并在离开主线程(程序)之前加入它们。
默认情况下,pthreads库中的线程创建为可连接。
但是,线程可能会分离,使它们不再可连接。 因为线程消耗系统资源直到加入,就像进程消耗资源直到它们的父调用wait()一样,你不打算连接的线程必须被分离,这是一个很好的编程习惯。
当然,一旦主例程退出,所有线程资源都被释放。
如果我们没有这样做(分离),那么,当线程终止时,它会生成相当于僵尸进程的线程。 除了浪费系统资源,如果有足够的线程僵尸累积,我们将无法创建额外的线程。
如果你想确定你的线程已经完成,你想调用pthread_join
。
如果不这样做,那么终止程序将突然终止所有未完成的线程。
也就是说,你的main
可以等待足够长的时间直到它退出。 但那么,你怎么能确定它是否足够?
如果你的主要结束了你的应用程序结束而你的线程死了……所以你需要使用线程连接(或者使用fork)。