如何停止/取消使用std :: async和policy std :: launch :: async创建的异步任务?换句话说,我已经开始一个任务运行在另一个线程,使用未来的对象.有没有办法取消或停止正在运行的任务?
解决方法
总而言之
更长的解释:没有安全的方法来取消标准C中的任何线程.这将需要线程取消.这个功能在C11标准化过程中被多次讨论,普遍的共识是没有安全的方法.据我所知,C有三种主要考虑线程取消的方法.
>中止线程.这就像一个紧急停止.不幸的是,它不会导致调用堆栈解析或析构函数.线程可能处于任何状态,因此可能会持有互斥体,堆分配的数据将被泄漏等.这显然永远不会被考虑很久,因为它会使整个程序未定义.如果你想自己做,但是只需要使用native_handle来做到这一点.然而,它将是不可移植的.
强制取消/中断点.当请求线程取消时,它内部设置一些变量,以便下一次调用预定义的一组中断点(例如睡眠,等待等)时,会抛出一些异常.这将导致堆栈展开并可以进行清理.不幸的是,这种类型的系统使得任何代码异常都非常困难,因为大多数多线程代码可以突然抛出.这是boost.thread使用的模型.它使用disable_interruption来解决一些问题,但是除了最简单的情况下,它仍然是非常困难的. Boost.thread使用这种模式,但它一直被认为是危险的,可以理解的,它不被接受到标准与其余.
>自愿取消/中断点.最终这归结为自己检查一些条件,当你想要,如果适当退出线程自己以受控的方式.我模糊地回忆起一些关于添加一些图书馆功能来帮助这个但是从未被同意的话题.
我只是使用一个变体3.如果你使用lambdas,这将是很容易引用一个原子“取消”变量,你可以不时检查.