我正在考虑在我的应用程序中使用 C++0x 线程而不是 Boost 线程。但是,我不确定如何使用标准 C++0x 线程重新实现我所拥有的,因为它们似乎没有 interrupt()
方法。
我当前的设置是:
- 管理工作的主线程;
- 执行主人命令的几个工作线程。
Workers 在至少两个不同的条件变量上调用 wait()
。 Master 有一个“超时”状态:在这种情况下,它告诉所有 worker 停止并给出他们当时得到的任何结果。使用 Boost 线程主控器只需在线程组上使用 interrupt_all()
,这会导致 worker 停止等待。如果他们此刻不在等待,master 还会设置一个 bool
标记,worker 会定期检查该标记。
但是,在 C++0x std::thread
中,我没有看到 interrupt()
的任何替代品。我想念什么吗?如果不是,我如何实现上述方案,让 worker 不能永远 sleep ?
最佳答案
不幸的是,我没有看到除了轮询之外的其他方法,而不是使用等待,而是使用定时等待和一个变量来声明中断已经完成。
void th(Interruptor& interruptor) {
try {
...
while (cnd1.timed_wait(d)==false) {
interruptor.check_interruption_point();
}
...
} catch (interrupted_exception &) {}
}
Interruptor 类将维护一个受互斥锁保护的 bool 变量或使用原子操作(如果有的话)和两个函数 interrupt 和 check_interruption_point,如果 bool 值为真,则抛出 interrupted_exception。 Mater 线程将创建一个 Interruptor 变量,该变量将在创建时提供给相关线程。 master 有可能立即中断所有依赖于此中断器的线程。如果您想一次显式中断一个线程,您当然可以为每个线程创建一个中断器。
由您来定义定时等待的持续时间,以便您的线程能够在您的程序需要时立即使用react。
关于c++ - 如何中断等待的 C++0x 线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2845704/