Можно ли проверить std::future
, закончился или нет? Насколько я могу судить, единственный способ сделать это - позвонить wait_for
с нулевой продолжительностью и проверить, есть ли статус ready
, но есть ли способ лучше?
c++
multithreading
c++11
future
Дэвид Браун
источник
источник
valid
проверяет только, есть ли у будущего общее состояние (т.е. оно возвращаетсяtrue
до тех пор, пока неget
будет вызвано в будущем).get
был вызван и вернул сохраненное значение, вы все еще хотитеtrue
? (Я не уверен, почему это может быть полезно, поскольку вы можете получить значение только один раз.)QFuture::isFinished
сути, эквивалент Qt .Ответы:
Вы правы, и кроме звонка
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; }
NB, если функция отложена, это никогда не вернет истину, поэтому, вероятно, лучше проверить
wait_for
напрямую в том случае, когда вы можете захотеть запустить отложенную задачу синхронно по истечении определенного времени или при низкой загрузке системы.источник
for(int i = 0; i < 1000; i++) f.wait_for(chrono::seconds(0));
занимает 43 мс времени настенных часов.Для std :: future работает функция-член is_ready . А пока у реализации VC есть член _Is_ready ().
источник
Моя первая ставка заключалась в том, чтобы уравнять
wait_for
с продолжительностью 0 и проверить код результата, который может быть одним изfuture_status::ready
,future_status::deferred
илиfuture_status::timeout
.В cppreference они утверждают, что
valid()
проверяет, доступен ли результат , но стандарт говорит, чтоvalid()
он вернется,true
если*this
относится к общему состоянию, независимо от того, готово ли это состояние или нет.источник