【问题标题】:how to join thread if joinable do nothing otherwise?如果可以加入,如何加入线程,否则什么都不做?
【发布时间】:2013-04-15 13:46:14
【问题描述】:

我正在使用boost::thread join 方法等待线程完成。但是,如果我在线程已经完成时尝试 join 线程,我会收到异常。那我该怎么做:

如果活跃则加入线程,如果不活跃则不执行任何操作?

【问题讨论】:

  • 这个帖子可能会有所帮助:stackoverflow.com/questions/1667420/…
  • 你确定没有其他事情发生吗?在手册中它说If the thread of execution represented by the boost::thread object has already completed, or the boost::thread object represents Not-a-Thread, then join() returns immediately.

标签: c++ boost


【解决方案1】:

使用joinable()函数判断是否应该加入:

if (thread.joinable()) thread.join();

您可以(事实上,您必须)加入一个线程,即使它已经完成,除非它已被分离。加入两次,或者加入空线程或分离线程都是错误的。

【讨论】:

  • 谢谢!我假设if (thread.joinable()) thread.join(); 不是原子操作,所以.. 不太可能但仍有可能收到异常?
  • @javapowered:不,应该没有例外,除非你加入两次。在您调用join 时,其他线程是否已完成并不重要 - 无论如何都需要加入。 (当然,如果两个线程都试图以这种方式加入它,你将有一场比赛;但那将是一个疯狂的设计。
  • 明确说明:joinable() 如果线程尚未加入且未分离,则返回 true。这两者都是全球性的行动,不应该在可能发生比赛的情况下进行。
猜你喜欢
  • 1970-01-01
  • 2012-02-15
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
相关资源
最近更新 更多