2012-06-05 5 views
49

Czy można sprawdzić, czy zakończyło się std::future? O ile mogę powiedzieć, jedynym sposobem na zrobienie tego byłoby wywołanie wait_for z zerowym czasem trwania i sprawdzenie, czy status jest ready czy nie, ale czy istnieje lepszy sposób?Uzyskaj status std :: future

+0

Sprawdź "ważne"? –

+6

@CatPlusPlus O ile się nie mylę, 'valid' sprawdza tylko, czy przyszłość ma wspólny stan (tzn. Zwraca' true', dopóki 'get' nie zostanie wywołany w przyszłości). –

+0

Tak więc, jeśli 'get' został wywołany i zwraca zapisaną wartość, czy nadal chcesz' true'? (Nie jestem pewna, dlaczego byłaby przydatna, ponieważ możesz uzyskać wartość tylko raz.) –

Odpowiedz

36

Masz rację, i oprócz wywołania wait_until z czasem w przeszłości (co jest równoważne) nie ma lepszego sposobu.

Zawsze możesz napisać trochę opakowanie jeśli chcesz bardziej wygodne składnię:

template<typename R> 
    bool is_ready(std::future<R> const& f) 
    { return f.wait_for(std::chrono::seconds(0)) == std::future_status::ready; } 

nb jeśli funkcja zostanie odroczona, to nigdy nie zwróci wartości true, więc prawdopodobnie lepiej jest sprawdzić wait_for bezpośrednio w przypadku, gdy możesz chcieć uruchomić odroczone zadanie synchronicznie po upływie pewnego czasu lub gdy obciążenie systemu jest niskie.

+1

wait_for nie mutuje przyszłości, więc parametr może być zadeklarowany jako const. –

+1

Należy rozważyć sprawdzenie valid() jako pierwszej, aby uniknąć błędów czasu wykonywania, jeśli get został już wywołany lub nie została zainicjowana w przyszłości. –

+2

Czy wait_for (chrono :: seconds (0)) gwarantuje natychmiastowy powrót lub czy może dać kontrolę nad wątkiem przez kilka milisekund na niektórych implementacjach? Byłoby to dość ważne, aby wiedzieć, że kilka milisekund to dużo czasu podczas kodowania gry ... – kynnysmatto

6

Mój pierwszy zakład byłoby nazwać wait_for z 0 trwania, i sprawdzić kod wynik, który może być jednym z future_status::ready, future_status::deferred lub future_status::timeout.

W cppreference twierdzą, że valid()sprawdza, czy wynik jest dostępny, ale standard mówi, że valid() powróci true jeśli *this odnosi się do wspólnego państwa, niezależnie od tego, czy państwo jest gotowy czy nie.

+4

cppreference został zaktualizowany i stwierdza "sprawdza, czy przyszłość ma stan współdzielony". (Nie jestem pewien, czy chcesz usunąć drugi akapit, czy edytować go, więc nie będę go modyfikował). – Default

7

Istnieje funkcja is_ready dla użytkownika in the works dla std :: future. W międzyczasie implementacja VC ma członka _Is_ready().