为什么std :: thread没有try_join_for()和interrupt()方法

时间:2014-04-24 09:25:12

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

任何人都可以通过以下方式向我解释为什么std::threadboost::thread不同:

  1. 它没有try_join_for / try_join_until方法
  2. 没有interrupt方法
  3. https://isocpp.org/wiki/faq/cpp11-library-concurrency有一些解释:

    无法请求线程终止(即请求尽快退出并尽可能优雅地退出)或强制线程终止(即终止它)。我们留下了

    的选项
    1. 设计我们自己的合作“中断机制”(带有一个共享数据,调用者线程可以为被调用的线程设置一个共享数据进行检查,并在设置时快速,优雅地退出),
    2. 通过使用thread :: native_handle()获取对操作系统线程概念的访问权限
    3. “go native”,
    4. 终止进程(std::quick_exit()),
    5. 杀死程序(std::terminate())。 这是委员会可以同意的全部内容。特别是POSIX的代表强烈反对任何形式的“线程取消”,但是很多C ++的资源模型都依赖于析构函数。每个系统和每个可能的应用都没有完美的解决方案。
    6. 但也许还有更完整的解释?这些方法(try_joininterrupt)有时非常有用。

1 个答案:

答案 0 :(得分:5)

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

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

@ Howard-Hinnant建议:委员会有声音坚决声称合作线程取消不能在C ++中可移植地实现。当时boost :: thread没有中断。因此,安东尼·威廉姆斯实施了对提升的中断,这在很大程度上是因为目前提出的概念证明可以可移植地实施。委员会在很大程度上忽略了这一概念证明,主要是因为已经花了很多时间来讨论这个问题,因为这个问题导致我们面临着整个标准下沉的风险。