有没有一种方法来取消/分离,在未来,C ++ 11?(Is there a way to cance

2019-06-17 20:39发布

我有以下代码:

#include <iostream>
#include <future>
#include <chrono>
#include <thread>

using namespace std;

int sleep_10s()
{
    this_thread::sleep_for(chrono::seconds(10));
    cout << "Sleeping Done\n";
    return 3;
}

int main()
{
    auto result=async(launch::async, sleep_10s);
    auto status=result.wait_for(chrono::seconds(1));
    if (status==future_status::ready)
        cout << "Success" << result.get() << "\n";
    else
        cout << "Timeout\n";
}

据说这是为了等待1秒,打印“超时”,并退出。 不是退出的,它等待一个额外的9秒,打印“睡眠完成”,然后段错误。 有没有办法取消或卸下未来,所以我的代码将在主要结束,而不是等待将来完成执行退出?

Answer 1:

在C ++ 11标准并没有提供直接的方式来取消任务开始std::async 。 你将不得不实现自己的取消机制,比如在原子标志变量传递给它定期检查异步任务。

您的代码不应该,虽然崩溃。 在到达结束mainstd::future<int>举办目的result被破坏,这将等待任务完成,然后丢弃其结果,清理所使用的任何资源。



Answer 2:

这里使用原子布尔一个简单的例子来同时取消一个或多个未来。 原子布尔可以在取消类中(取决于口味)包裹。

#include <chrono>
#include <future>
#include <iostream>

using namespace std;

int long_running_task(int target, const std::atomic_bool& cancelled)
{
    // simulate a long running task for target*100ms, 
    // the task should check for cancelled often enough!
    while(target-- && !cancelled)
        this_thread::sleep_for(chrono::milliseconds(100));
    // return results to the future or raise an error 
    // in case of cancellation
    return cancelled ? 1 : 0;
}

int main()
{
    std::atomic_bool cancellation_token;
    auto task_10_seconds= async(launch::async, 
                                long_running_task, 
                                100, 
                                std::ref(cancellation_token));
    auto task_500_milliseconds = async(launch::async, 
                                       long_running_task, 
                                       5, 
                                       std::ref(cancellation_token));
// do something else (should allow short task 
// to finish while the long task will be cancelled)
    this_thread::sleep_for(chrono::seconds(1));
// cancel
    cancellation_token = true;
// wait for cancellation/results
    cout << task_10_seconds.get() << " " 
         << task_500_milliseconds.get() << endl;
}


文章来源: Is there a way to cancel/detach a future in C++11?
标签: c++ c++11 future