【发布时间】: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