是否有必要致电pthread_join()[英] is it necessary to call pthread_join()

本文是小编为大家收集整理的关于是否有必要致电pthread_join()的处理方法,想解了是否有必要致电pthread_join()的问题怎么解决?是否有必要致电pthread_join()问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

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

推荐答案

pthread_join做两件事:

  1. 等待线程完成.
  2. 清理与线程相关的任何资源.

如果您在不加入的情况下退出过程,则(2)将由OS为您完成(尽管它不会进行线程取消清理,只需将线程从轨道上核算),并且(1)不会.因此,您是否需要调用pthread_join取决于您是否需要(1)发生.

如果您不需要线程来运行,那么其他所有人都说您也可以分离它.一个独立线程无法连接(因此您迫不及待地完成其完成),但是如果它完成的话,它的资源会自动释放.

其他推荐答案

是的,如果线程可连接,则必须是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).

其他推荐答案

退出时,您无需加入,因为所有其他线程和资源都将自动清理.这假设您实际上希望所有线程在退出时被杀死.

如果您不需要加入线程,则可以在创建线程之前在属性上使用pthread_attr_setdetachstate来创建它作为"分离"线程.独立线程不能连接,但是它们不需要也可以加入.

所以,

  1. 如果要在程序完成之前完成所有线程,则从主线程加入可以使此工作.

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

  3. 如果您不需要所有线程即可完成,请从MAIN返回.所有其他线程都将被摧毁.您也可以将线程创建为分离线程,这可能会减少资源消耗.

本文地址:https://www.itbaoku.cn/post/359109.html