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

dou*_*lep 9 c++ multithreading interrupt c++11

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

我目前的设置是:

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

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

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

Vic*_*iba 10

不幸的是,我没有看到另一种方式而不是轮询,而不是使用等待使用定时等待和变量来表示中断已经完成.

void th(Interruptor& interruptor) {
  try {

    ...

    while (cnd1.timed_wait(d)==false) {
      interruptor.check_interruption_point();
    }
    ...
  } catch (interrupted_exception &) {}
}
Run Code Online (Sandbox Code Playgroud)

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

由您决定定时等待的持续时间,因此您的线程能够在程序需要时立即做出反应.