c++11 - 为什么 std::thread 没有 try_join_for() 和 interrupt() 方法

标签 c++11 concurrency c++-standard-library

谁能解释我为什么std::thread不同于 boost::thread通过以下方式:

  • 它没有 try_join_for/try_join_until方法
  • 它没有 interrupt方法

  • 有一些解释来自https://isocpp.org/wiki/faq/cpp11-library-concurrency :

    没有办法请求一个线程终止(即请求它尽快并尽可能优雅地退出)或强制一个线程终止(即杀死它)。我们剩下的选择是
  • 设计我们自己的协作“中断机制”(带有一段共享数据,调用者线程可以设置供被调用线程检查,并在设置时快速优雅地退出),
  • 通过使用 thread::native_handle() 来访问操作系统的线程概念,“走向原生”,
  • 终止进程 ( std::quick_exit() ),
  • 终止程序 ( std::terminate() )。
    这是委员会所能达成的全部共识。特别是,POSIX 的代表强烈反对任何形式的“线程取消”,无论 C++ 的资源模型多少都依赖于析构函数。对于每个系统和每个可能的应用,没有完美的解决方案。

  • 但也许还有更完整的解释?此类方法( try_joininterrupt )有时非常有用。

    最佳答案

    嗯,你自己回答了你的问题。 boost 和 c++11 标准之间的重要区别在于,c++11 是一个标准。所以基本上每个人都必须同意与线程相关的方法和功能。但是正如您已经告诉我们的那样,“此类方法(try_join 和中断) 有时 非常有用”

    那么将其作为标准强加给每个编译器是否合理?也许吧,但如果你真的需要它,你也可以简单地使用 boost 等价物,直到它可能有一天进入标准。

    @Howard-Hinnant 建议:委员会中有声音坚决要求取消合作线程不能 可移植地用 C++ 实现。当时 boost::thread 没有中断。所以安东尼威廉姆斯在很大程度上实现了提升中断,正如目前作为概念证明提出的那样可以 可移植地实现。这个概念证明在很大程度上被委员会忽略了,主要是因为在这个主题上已经花费了太多时间,我们有可能因为这个问题而使整个标准下沉。

    关于c++11 - 为什么 std::thread 没有 try_join_for() 和 interrupt() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23264891/

    相关文章:

    C++ std::库之间的异常

    c++ - 如何使 C++ lambda 对象的存储更高效?

    c++ - std::unique_ptr,自定义删除器和类型更改

    c++ - 模板常量/非常量方法

    c++ - C++中的15种类型分类是什么?

    c++ - 发生在同一线程中的关系之前

    java - 锁定字符串

    C++ - 如何在不重载比较运算符的情况下为 std::max 专门化自定义类型?

    java - 如何使用Java同时发送不同的Web服务请求到不同的目的地?

    c++ - 如果我使用函数指针作为值对,我会遇到 STL::pair 问题 2051 吗?