【问题标题】:Why std::thread doesn't have try_join_for() and interrupt() methods为什么 std::thread 没有 try_join_for() 和 interrupt() 方法
【发布时间】:2014-04-24 09:25:12
【问题描述】:

谁能解释一下为什么std::threadboost::thread 不同:

  1. 它没有try_join_for / try_join_until 方法
  2. 没有interrupt方法

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

没有办法请求线程终止(即要求它尽快且尽可能优雅地退出)或强制线程终止(即杀死它)。我们剩下的选项是

  1. 设计我们自己的协作“中断机制”(调用者线程可以设置一个共享数据供被调用线程检查,并在设置后快速优雅地退出),
  2. 通过使用 thread::native_handle() 来“实现原生化”,以访问操作系统的线程概念,
  3. 杀死进程(std::quick_exit()),
  4. 杀死程序(std::terminate())。 这是委员会所能达成的全部协议。特别是,来自 POSIX 的代表强烈反对任何形式的“线程取消”,无论 C++ 的资源模型在很大程度上依赖于析构函数。对于每个系统和每个可能的应用,没有完美的解决方案。

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

【问题讨论】:

  • 你如何定义interrupt 除了正式地“执行未定义的行为”之外的功能?
  • @Yakk Like this.
  • @casey 不错。基本上每个并发原语上都有一个附加的隐式信号。这确实违反了“你不用为你使用的东西付费”,除非你变得非常非常聪明......但是我猜每个同步的分支足够便宜。

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


【解决方案1】:

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

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

@Howard-Hinnant 建议:委员会中有声音坚决声称协作线程取消不能在 C++ 中可移植地实现。当时 boost::thread 没有中断。因此,Anthony Williams 实现了用于 boost 的中断,这主要是作为目前提出的概念证明,它可以可移植地实现。委员会在很大程度上忽略了这一概念证明,主要是因为已经在该主题上花费了太多时间,以至于我们有可能因为这个问题而使整个标准陷入困境。

【讨论】:

  • 我要补充一点,委员会中有声音坚决声称协作线程取消不能在 C++ 中可移植地实现。当时 boost::thread 没有中断。因此,Anthony Williams 实现了用于 boost 的中断,这主要是作为目前提出的概念证明,它可以可移植地实现。委员会在很大程度上忽略了这一概念证明,主要是因为已经在这个主题上花费了太多时间,以至于我们有可能因为这个问题而使整个标准陷入困境。
  • 委员会用 C++11 完成了许多伟大的事情。这不是其中之一。
  • 致那些投反对票的人:如果你给我留言,我可以试着找出改进的方法和地方:)
猜你喜欢
  • 2021-04-27
  • 1970-01-01
  • 2012-01-22
  • 1970-01-01
  • 2015-04-02
  • 2018-06-10
  • 2017-10-18
  • 2017-03-23
  • 1970-01-01
相关资源
最近更新 更多