C++ 取消一个c++;11异步任务
如何停止/取消使用C++ 取消一个c++;11异步任务,c++,asynchronous,c++11,C++,Asynchronous,C++11,如何停止/取消使用std::async和策略std::launch::async创建的异步任务?换句话说,我已经使用future对象启动了在另一个线程上运行的任务。有没有办法取消或停止正在运行的任务?在C++11中(我认为)没有标准的方法来取消线程。如果您获得std::thread::native_handle(),您可以使用它做一些事情,但这是不可移植的。简而言之,不
std::async
和策略std::launch::async
创建的异步任务?换句话说,我已经使用future对象启动了在另一个线程上运行的任务。有没有办法取消或停止正在运行的任务?在C++11中(我认为)没有标准的方法来取消线程。如果您获得std::thread::native_handle(),您可以使用它做一些事情,但这是不可移植的。简而言之,不
<更长的解释:没有安全的方式来取消标准C++中的任何线程。这需要取消线程。这个特性在C++11标准化过程中已经讨论过很多次,普遍的共识是没有安全的方法来实现。据我所知,C++中有三种主要的线程取消方法。
native\u handle
即可。然而,它将是不可携带的boost.thread
使用的模型。它使用disable\u interruption
来解决一些问题,但除了最简单的情况外,要正确处理任何事情都非常困难Boost.thread
使用此模型,但它一直被认为是有风险的,可以理解,它没有与其他模型一起被纳入标准我只会使用3的变体。例如,如果您使用lambdas,则很容易引用原子“cancel”变量,您可以随时检查该变量。也许您可以通过检查某些条件来执行此操作:
class Timer{
public:
Timer():timer_destory(false){}
~Timer(){
timer_destory=true;
for(auto result:async_result){
result.get();
}
}
int register_event(){
async_result.push_back(
std::async(std::launch::async,[](std::atomic<bool>& timer_destory){
while(!timer_destory){
//do something
}
},std::ref(timer_destory))
);
}
private:
std::vector<std::future<int>> async_result;
std::atomic<bool> timer_destory;
}
类计时器{
公众:
Timer():Timer_destory(false){
~Timer(){
timer\u destory=真;
for(自动结果:异步结果){
result.get();
}
}
int寄存器_事件(){
async\u result.push\u back(
std::async(std::launch::async,[](std::atomic&timer\u destory){
而(!timer\u destory){
//做点什么
}
},std::ref(计时器销毁))
);
}
私人:
std::矢量异步_结果;
std::原子定时器;
}
cf.查看第三种方式的代码示例。