Можно ли проверить, закончен ли std::future
или нет? Насколько я могу судить, единственный способ сделать это - вызвать wait_for
с нулевой продолжительностью и проверить, является ли статус ready
или нет, но есть ли лучший способ?
Получить статус std:: future
Ответ 1
Вы правы, и, помимо вызова 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
непосредственно в том случае, если вы можете запускать отложенную задачу синхронно по прошествии определенного времени или при низкой загрузке системы.
Ответ 2
Здесь есть функция member_ready в работах для std:: future. Тем временем, реализация VC имеет член _Is_ready().
Ответ 3
Моя первая ставка заключалась бы в вызове wait_for
с длительностью 0 и проверке кода результата, который может быть одним из future_status::ready
, future_status::deferred
или future_status::timeout
.
В cppreference они утверждают, что valid()
проверяет, доступен ли результат, но стандарт говорит, что valid()
вернет true
если *this
относится к общему состоянию, независимо от того, готово ли это состояние или нет.