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

标签 c++ multithreading c++11 interrupt

我正在考虑在我的应用程序中使用 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/

相关文章:

c++ - 如何打印嵌套 std::unordered_map 的内容?

c++ - 用纯虚方法覆盖(常规)虚方法有什么影响?

c++ - 反转 C++ 字符串的时间复杂度

c++ - 重定向到文件后,使用 cout 或 cerr 输出到控制台

python - 如果持有数据库连接的线程死亡,数据库连接是否会返回池?

java - 单例线程安全列表的实现

java - 如何维护名称池?

c++ - <Swig 类型为 'std::map< char,int > 的对象的代理

c++ - 自 lambda 进入 C++ 以来, `Callback` 接口(interface)是否已过时?

c++ - 在文件描述和主页中使用注释