如何中断等待的C ++ 0x线程?

时间:2010-05-16 22:18:26

标签: c++ multithreading c++11 interrupt

我正在考虑在我的应用程序中使用C ++ 0x线程而不是Boost线程。但是,我不确定如何重新实现我对标准C ++ 0x线程的重新实现,因为它们似乎没有interrupt()方法。

我目前的设置是:

  • 管理工作的主线程;
  • 执行master命令的几个工作线程。

工作人员至少在两个不同的条件变量上调用wait()。师父有一个“超时”状态:在这种情况下,它会告诉所有工人停止并提供他们当时得到的任何结果。使用Boost线程master只在线程组上使用interrupt_all(),这会导致worker停止等待。如果他们现在没有等待,主人还会设置bool标志,工人定期检查。

但是,在C ++ 0x std::thread中,我没有看到interrupt()的替换。我错过了什么吗?如果没有,我如何实施上述计划,以便工人不能永远睡觉?

3 个答案:

答案 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相对容易,甚至可能很简单。)