c++ - 取消 C++ 11 异步任务

标签 c++ asynchronous c++11

如何停止/取消使用 std::async 和策略 std::launch::async 创建的异步任务?换句话说,我已经开始使用 future 对象在另一个线程上运行的任务。有没有办法取消或停止正在运行的任务?

最佳答案

简而言之,没有。

更长的解释:在标准 C++ 中没有安全的方法来取消任何线程。这将需要取消线程。这个特性在 C++11 标准化过程中被讨论过很多次,普遍的共识是没有安全的方法来这样做。据我所知,在 C++ 中主要考虑了三种线程取消方法。

  1. 中止线程。这更像是一个紧急停止。不幸的是,它会导致没有堆栈展开或调用析构函数。线程可能处于任何状态,因此可能持有互斥锁,分配给堆的数据会被泄漏,等等。显然,这永远不会被考虑太久,因为它会使整个程序未定义。如果您想自己执行此操作,只需使用 native_handle 即可。然而,它将是不可移植的。

  2. 强制取消/中断点。当请求线程取消时,它会在内部设置一些变量,以便下次调用任何一组预定义的中断点(例如 sleep 、等待等)时,它会抛出一些异常。这将导致堆栈展开并可以完成清理。不幸的是,这种类型的系统使得任何代码异常安全变得非常困难,因为大多数多线程代码可能会突然抛出异常。这是 boost.thread 使用的模型。它使用 disable_interruption 来解决一些问题,但除了最简单的情况外,它仍然非常难以解决任何问题。 Boost.thread 使用此模型,但它一直被认为是有风险的,并且可以理解它没有与其他模型一起被接受为标准。

  3. 自愿取消/中断点。最终,这归结为您自己在需要时检查某些条件,并在适当的情况下以受控方式自行退出线程。我依稀记得有人谈论过要添加一些库功能来帮助解决这个问题,但从未达成一致。

我只会使用 3 的变体。例如,如果您使用的是 lambda,那么引用一个您可以不时检查的原子“取消”变量将非常容易。

关于c++ - 取消 C++ 11 异步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13678155/

相关文章:

c++ - 预编译 header IntelliSense 错误

c# - C# 任务什么时候真正开始?

异步触发多个谷歌云功能

c++ - 实例化类模板的可变成员函数模板

c++ - 为什么不能显式调用构造函数而析构函数可以?

c++ - 以可变参数函数为参数的函数

c++ - 如何初始化结构字段 std::map<std::string, std::string> 调用 params

asp.net - 为什么 IIS 线程与常规 CLR 线程相比如此宝贵?

c++ - 为 std::shared_ptr 指定一个删除器,它适用于特定类型或其派生类型的所有对象

c++ - C++11 中的正则表达式