获取 std: : future 的状态

是否可以检查 std::future是否已经完成?据我所知,唯一的方法就是调用持续时间为零的 wait_for并检查状态是否为 ready,但是有更好的方法吗?

47592 次浏览

My first bet would be to call wait_for with a 0 duration, and check the result code that can be one of future_status::ready, future_status::deferred or future_status::timeout.

valid() will return true if *this refers to a shared state, independently of whether that state is ready or not. See cppreference.

You are correct, and apart from calling wait_until with a time in the past (which is equivalent) there is no better way.

You could always write a little wrapper if you want a more convenient syntax:

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. if the function is deferred this will never return true, so it's probably better to check wait_for directly in the case where you might want to run the deferred task synchronously after a certain time has passed or when system load is low.

There's an is_ready member function in the works for std::future. In the meantime, the VC implementation has an _Is_ready() member.