Подтвердить что ты не робот

Получить статус std:: future

Можно ли проверить, закончен ли std::future или нет? Насколько я могу судить, единственный способ сделать это - вызвать wait_for с нулевой продолжительностью и проверить, является ли статус ready или нет, но есть ли лучший способ?

4b9b3361

Ответ 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 относится к общему состоянию, независимо от того, готово ли это состояние или нет.