如何停止/取消使用 std::async
和策略 std::launch::async
创建的异步任务?换句话说,我已经开始使用 future 对象在另一个线程上运行的任务。有没有办法取消或停止正在运行的任务?
最佳答案
简而言之,没有。
更长的解释:在标准 C++ 中没有安全的方法来取消任何线程。这将需要取消线程。这个特性在 C++11 标准化过程中被讨论过很多次,普遍的共识是没有安全的方法来这样做。据我所知,在 C++ 中主要考虑了三种线程取消方法。
中止线程。这更像是一个紧急停止。不幸的是,它会导致没有堆栈展开或调用析构函数。线程可能处于任何状态,因此可能持有互斥锁,分配给堆的数据会被泄漏,等等。显然,这永远不会被考虑太久,因为它会使整个程序未定义。如果您想自己执行此操作,只需使用
native_handle
即可。然而,它将是不可移植的。强制取消/中断点。当请求线程取消时,它会在内部设置一些变量,以便下次调用任何一组预定义的中断点(例如 sleep 、等待等)时,它会抛出一些异常。这将导致堆栈展开并可以完成清理。不幸的是,这种类型的系统使得任何代码异常安全变得非常困难,因为大多数多线程代码可能会突然抛出异常。这是
boost.thread
使用的模型。它使用disable_interruption
来解决一些问题,但除了最简单的情况外,它仍然非常难以解决任何问题。Boost.thread
使用此模型,但它一直被认为是有风险的,并且可以理解它没有与其他模型一起被接受为标准。自愿取消/中断点。最终,这归结为您自己在需要时检查某些条件,并在适当的情况下以受控方式自行退出线程。我依稀记得有人谈论过要添加一些库功能来帮助解决这个问题,但从未达成一致。
我只会使用 3 的变体。例如,如果您使用的是 lambda,那么引用一个您可以不时检查的原子“取消”变量将非常容易。
关于c++ - 取消 C++ 11 异步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13678155/