是否可以检查std::future
是否已完成?据我所知,唯一的方法就是调用wait_for
零持续时间并检查状态是否为ready
,但有更好的方法吗?
答案 0 :(得分:59)
你是对的,除了在过去的时间内调用wait_until
(相当于),没有更好的方法。
如果你想要一个更方便的语法,你总是可以写一个小包装器:
template<typename R>
bool is_ready(std::future<R> const& f)
{ return f.wait_for(std::chrono::seconds(0)) == std::future_status::ready; }
N.B。如果函数延迟,则永远不会返回true,因此在经过一定时间或系统负载较低后可能希望同步运行延迟任务的情况下,最好直接检查wait_for
。 / p>
答案 1 :(得分:9)
对于std :: future,有一个is_ready成员函数in the works。与此同时,VC实现有一个_Is_ready()成员。
答案 2 :(得分:7)
我的第一个赌注是拨打wait_for
0持续时间,并查看结果代码,该代码可以是future_status::ready
,future_status::deferred
或future_status::timeout
之一。
在cppreference中,他们声称valid()
会检查结果是否可用,但标准显示valid()
将true
返回*this
{ {1}}指的是共享状态,与该状态是否就绪无关。