【问题标题】:How can I tell whether a boost::thread has finished execution or not?如何判断 boost::thread 是否已完成执行?
【发布时间】:2011-11-19 04:31:33
【问题描述】:

我不一定想使用join() 并等待线程完成,但更想简要检查一下线程是否仍在执行。我确实想到了timed_join(0),但我不确定这是否安全。这里有什么建议吗?

【问题讨论】:

  • 答案基本上是使用timed_join(0)(或最小超时)。如果这是唯一的方法,那么我的超时时间应该多长以避免竞争条件?
  • 进行这种检查时,不可能避免竞争条件。如果您执行timed_join(N),那么无论您使用什么 N 值,线程都可以在该指令之后立即完成。你到底想达到什么目标?
  • 不,您应该使用事件/通知机制让线程在完成时发出信号,并使用整体事件等待所有线程完成。这称为倒计时锁存器(请参阅msdn.microsoft.com/en-us/magazine/cc163427.aspx#S1)。您可以使用 boost 条件变量和受 boost mutex 保护的 int 计数器构建一个。
  • 实际上,更简单的方法应该是在一个循环中按顺序加入所有线程。没有必要尝试并行化,因为在最坏的情况下,第一个连接将比所有其他线程花费更长的时间来完成,但到那时,其余的连接将花费零时间(因为它们都已完成)。跨度>

标签: c++ multithreading boost


【解决方案1】:

您应该使用事件/通知机制让线程在完成时发出信号,并使用整体事件等待所有线程完成。这称为倒计时锁存器(请参阅http://msdn.microsoft.com/en-us/magazine/cc163427.aspx#S1)。您可以使用 boost 条件变量和受 boost mutex 保护的 int 计数器构建一个。

一个更简单的方法应该是在一个循环中按顺序加入所有线程。没有必要尝试并行化,因为在最坏的情况下,第一个连接将比所有其他线程花费更长的时间来完成,但到那时,其余的连接将花费零时间(因为它们都已完成)。

如果您对允许首先完成哪些线程和复杂的生命周期图有硬性依赖,您应该考虑使用类/数据结构来表示这些以提高抽象级别,这样外部服务员就不需要直接关心关于这些细节。

【讨论】:

    猜你喜欢
    • 2014-01-13
    • 2014-06-08
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    相关资源
    最近更新 更多