代码之家  ›  专栏  ›  技术社区  ›  doublep

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

  •  9
  • doublep  · 技术社区  · 14 年前

    interrupt() 方法。

    我当前的设置是:

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

    工人呼叫 wait() interrupt_all() 在线程组上,这会导致工作线程停止等待。如果他们现在不在等,师父也会设置一个 bool

    但是,在C++ 0x中 std::thread 我看不到任何替代品 中断()

    3 回复  |  直到 14 年前
        1
  •  10
  •   Vicente Botet Escriba    14 年前

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

    Interruptor类将维护一个受互斥保护的布尔变量,或者使用原子操作(如果有)和两个函数中断并检查\u interruption \u point,如果布尔值为真,它将抛出一个中断的\u异常。主线程将创建一个中断器变量,该变量将在创建时提供给相关线程。主机有可能立即中断依赖于这个中断器的所有线程。当然,如果希望一次显式中断一个线程,可以为每个线程创建一个中断器。

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

        2
  •  2
  •   Gaetano Mendola    14 年前

    Wait boost对interrupt()的作用是在线程当前被阻塞的情况下发出notify\ all,然后检查是否请求了中断。如果请求了中断,那么它会抛出boost::thread\u interrupted。你可以自己写一篇文章

        3
  •  2
  •   Nanno Langstraat    11 年前

    事实上,C++ 11 STD::线程没有提供一个标准的机制(但是?)。因此,我支持@doublep暂时使用boost::thread的决定。

    我们更喜欢使用C++ 11 STD::设施。但我们不想重建boost terminate()

    boost::thread和std::thread非常相似,我们觉得自己没有陷入困境,这很有帮助(我们希望最终迁移到std::thread相对容易,甚至可能是微不足道的。)