我有以下代码:
#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秒,打印“睡眠完成”,然后段错误。 有没有办法取消或卸下未来,所以我的代码将在主要结束,而不是等待将来完成执行退出?
在C ++ 11标准并没有提供直接的方式来取消任务开始std::async
。 你将不得不实现自己的取消机制,比如在原子标志变量传递给它定期检查异步任务。
您的代码不应该,虽然崩溃。 在到达结束main
的std::future<int>
举办目的result
被破坏,这将等待任务完成,然后丢弃其结果,清理所使用的任何资源。
这里使用原子布尔一个简单的例子来同时取消一个或多个未来。 原子布尔可以在取消类中(取决于口味)包裹。
#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;
}