9

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

我目前的设置是:

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

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

但是,在 C++0x 中,std::thread我看不到interrupt(). 我错过了什么吗?如果没有,我该如何实施上述方案,使工人不能永远睡觉?

4

3 回答 3

10

不幸的是,除了轮询之外,我没有看到其他方法,而不是使用等待,而是使用定时等待和一个变量来说明中断已经完成。

void th(Interruptor& interruptor) {
  try {

    ...

    while (cnd1.timed_wait(d)==false) {
      interruptor.check_interruption_point();
    }
    ...
  } catch (interrupted_exception &) {}
}

Interruptor 类将维护一个使用互斥锁保护的布尔变量或使用原子操作(如果您有它们)和两个函数 interrupt 和 check_interruption_point,如果布尔值为 true,则抛出一个 interrupted_exception。Mater 线程将创建一个 Interruptor 变量,该变量将在创建时提供给相关线程。主服务器有可能立即中断依赖于该中断器的所有线程。如果您想一次显式中断一个线程,您当然可以为每个线程创建一个中断器。

由您来定义定时等待的持续时间,以便您的线程能够在您的程序需要时立即做出反应。

于 2010-05-16T23:03:38.440 回答
2

事实上,C++11 std::thread 并没有为此提供标准机制(还没有?)。因此,我支持@doublep 暂时使用 boost::thread 的决定。

我们更喜欢使用 C++11 std:: 设施。但是我们不想terminate()无缘无故地重建 boost 的设施,完成条件变量 futzing 以中断睡眠等。创建这样的基础设施很有趣,而且没有那么困难,但效率低下,而且比使用 boost 标准低。

boost::thread 和 std::thread 是如此相似,以至于我们觉得我们并没有把自己画到一个角落里,这很有帮助。(我们预计最终迁移到 std::thread 会相对容易,甚至可能微不足道。)

于 2013-12-12T13:59:13.360 回答
2

对 interrupt() 的等待提升是在线程当前被阻塞的情况下发出 notify_all,然后检查是否请求了中断。如果请求中断,那么它会抛出 boost::thread_interrupted。您可以使用该机制基于 std::thread 编写自己的线程类。

于 2010-08-30T11:08:34.313 回答