2010-05-16 52 views
9

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

我目前的设置是:

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

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

但是,在C++ 0x std::thread我看不到任何替代interrupt()。我想念什么?如果没有,我怎样才能落实上述计划,使工人不会永远睡眠?

回答

9

不幸的是,我没有看到另一种方式比轮询,而不是等待使用定时等待和变量来表明中断已完成。如果你有他们和两个功能中断和check_interruption_point,这与抛出interrupted_exception如果布尔值为true

void th(Interruptor& interruptor) { 
    try { 

    ... 

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

断续器类将保持与互斥保护或利用原子操作的布尔变量。 Mater线程将创建一个Interruptor变量,该变量将在创建时发送给相关线程。主人有可能立即中断所有依赖这个中断者的线程。如果你想一次明确地中断一个线程,你当然可以为每个线程创建一个中断器。

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

+0

我想我会继续使用Boost线程。他们也是越野车,但至少我对他们有一个稳定的解决方法。 – doublep 2010-05-17 13:47:09

1

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

+2

大概写我自己的条件子类,以便线程知道它等待什么?这对我来说听起来有点太过分了。 – doublep 2010-09-04 23:24:43

1

的确,C++ 11 std :: thread并没有提供这个标准的机制(还没有?)。因此,我第二@ doublep决定暂时使用boost :: thread。

我们更愿意使用C++ 11 std :: facilities。但是我们不想重新构建boost的terminate()工具,无条件地完成条件变量futzing以中断睡眠等。创建像这样的基础设施是乐趣,并没有那么困难,但没有生产力,并且比使用boost更不标准。

它有助于提升::线程和std ::线程是如此相似,我们觉得我们没有把自己绘成一个角落。 (我们预计最终迁移到std :: thread会相对容易,甚至可能是微不足道的。)