【问题标题】:Why is boost::thread::join seemingly so expensive?为什么 boost::thread::join 看起来如此昂贵?
【发布时间】:2011-06-25 17:43:26
【问题描述】:

我最近刚开始使用boost::thread 进行多线程处理,我对一些细节还有些不清楚,但据我了解,当您希望“父”线程阻塞并等待时使用thread::join让线程完成(我相信它不止于此,但我相信这是一种用途)。

在我正在处理的程序中,我有一个线程加载一堆资源,然后在最后一行,将其状态设置为“完成”。主线程等待这个状态,然后调用join,但它似乎需要大约2秒才能解除阻塞。

这是有原因的,还是我做错了什么?

【问题讨论】:

  • 如何等待状态变为“完成”?
  • @nos:我忘了提到我正在使用线程类,它有一个存储状态的成员变量,主线程检查该状态。那部分似乎工作正常。主线程快速获取更新状态,但调用join时,会暂停一下。
  • 好吧,如果你正忙着旋转等待状态改变,那很糟糕(虽然不太可能不是延迟的原因)。
  • 向我们展示线程的代码。
  • @nos:嗯,状态检查发生在我的主程序循环期间,所以它仍然检查用户输入,处理事件等,所以“空闲”是故意的(因为我需要这些资源来继续),但我使用线程的原因是因为我不想让窗口冻结并且在那段时间没有响应。

标签: c++ multithreading boost


【解决方案1】:

当然,加入一个线程不需要两秒钟(假设系统通常没有过载)。您看到的等待时间可能是由于子级在通知父级后正在执行的其他一些工作,或者在父级轮询来自子级的通知时执行的其他工作。

【讨论】:

  • 我还没有检查它,但我正在查看代码,我在踢自己的脑袋。我意识到,在最后一行之后,仍然需要为线程中生成的大型 JSON 树调用析构函数。回到这里,看到你的回答证实了这一点。谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-07-12
  • 2011-05-03
  • 1970-01-01
  • 2019-11-06
  • 1970-01-01
  • 1970-01-01
  • 2010-12-23
  • 2017-06-04
相关资源
最近更新 更多