我正在考虑在我的应用程序中使用C ++ 0x线程而不是Boost线程。但是,我不确定如何重新实现我对标准C ++ 0x线程的重新实现,因为它们似乎没有interrupt()
方法。
我目前的设置是:
工作人员至少在两个不同的条件变量上调用wait()
。师父有一个“超时”状态:在这种情况下,它会告诉所有工人停止并提供他们当时得到的任何结果。使用Boost线程master只在线程组上使用interrupt_all()
,这会导致worker停止等待。如果他们现在没有等待,主人还会设置bool
标志,工人定期检查。
但是,在C ++ 0x std::thread
中,我没有看到interrupt()
的替换。我错过了什么吗?如果没有,我如何实施上述计划,以便工人不能永远睡觉?
答案 0 :(得分:9)
不幸的是,我没有看到另一种方式而不是轮询,而不是使用等待使用定时等待和变量来说明中断已经完成。
void th(Interruptor& interruptor) {
try {
...
while (cnd1.timed_wait(d)==false) {
interruptor.check_interruption_point();
}
...
} catch (interrupted_exception &) {}
}
Interruptor类将维护一个使用互斥锁保护的布尔变量或使用原子操作(如果你有)和两个函数interrupt和check_interruption_point,如果boolean为true则抛出interrupt_exception。 Mater线程将创建一个Interruptor变量,该变量将在创建时提供给相关的线程。主机可以立即中断所有依赖于此中断器的线程。如果你想一次显式地中断一个线程,你当然可以为每个线程创建一个中断器。
由您来定义定时等待的持续时间,以便您的线程能够在程序需要时立即做出反应。
答案 1 :(得分:1)
中断()的等待提升是在线程当前被阻止的情况下发出notify_all,然后检查是否请求了中断。如果请求中断,那么它会抛出boost :: thread_interrupted。你可以写一个自己的线程 基于std :: thread的类和机制。
答案 2 :(得分:1)
确实,C ++ 11 std :: thread没有为此提供标准机制(但是?)。因此,我第二次决定使用boost :: thread来决定使用boost :: thread。
我们更喜欢使用C ++ 11 std :: facilities。但是我们不想重新构建boost terminate()
工具,完成条件变量futuring以中断睡眠等,无缘无故。创建像这样的基础设施有趣,并不是那么困难,但是没有效率,而且比使用boost更低标准。
它有助于boost :: thread和std :: thread非常相似,我们觉得我们并没有将自己画成一个角落。 (我们希望最终迁移到std :: thread相对容易,甚至可能很简单。)