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
    即可。然而,它将是不可携带的

  • 强制取消/中断点。当线程取消被请求时,它会在内部设置一些变量,以便下次调用任何预定义的中断点集(如sleep、wait等)时,它会抛出一些异常。这将导致堆栈展开,可以进行清理。不幸的是,这种类型的系统很难保证任何代码异常的安全,因为大多数多线程代码可能会突然抛出。这是
    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.查看第三种方式的代码示例。