2012-06-05 18 views
49

È possibile verificare se uno std::future è terminato o meno? Per quanto ne so, l'unico modo per farlo sarebbe chiamare lo wait_for con una durata zero e controllare se lo stato è ready oppure no, ma c'è un modo migliore?Ottenere lo stato di uno std :: future

+0

Verificare la presenza di 'valido'? –

+6

@CatPlusPlus A meno che non mi sbaglio, 'valid' controlla solo se il futuro ha uno stato condiviso (cioè restituisce' true' finché 'get' non viene chiamato in futuro). –

+0

Quindi, se 'get' è stato chiamato e restituisce il valore memorizzato, vuoi ancora' true'? (Non sono sicuro del motivo per cui sarebbe utile, dal momento che puoi ottenere il valore solo una volta.) –

risposta

36

Si è corretto, e oltre a chiamare wait_until con un tempo nel passato (che è equivalente) non esiste un modo migliore.

Si può sempre scrivere un po 'involucro, se si desidera una più comoda sintassi:

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. se la funzione viene differita, non restituirà mai true, quindi è probabilmente meglio controllare wait_for direttamente nel caso in cui si desideri eseguire l'attività posticipata in modo sincrono dopo che è trascorso un certo tempo o quando il carico del sistema è basso.

+1

wait_for non muta il futuro in modo che il parametro possa essere dichiarato come const. –

+1

Considerare innanzitutto il controllo valid() per evitare errori di run time se get è stato già chiamato o il futuro non è mai stato inizializzato. –

+2

È wait_for (chrono :: seconds (0)) restituito immediatamente o potrebbe fornire il controllo del thread per un paio di millisecondi su alcune implementazioni? Questo sarebbe molto importante sapere come un paio di millisecondi è un sacco di tempo quando si codifica un gioco ... – kynnysmatto

6

La mia prima scommessa sarebbe chiamare wait_for con una durata 0 e controllare il codice risultato che può essere uno di future_status::ready, future_status::deferred o future_status::timeout.

In cppreference Essi affermano che valid()controlla se il risultato è disponibile, ma lo standard dice che valid() tornerà true se *this si riferisce ad uno stato comune, indipendentemente dal fatto che sia stato pronto o meno.

+4

cppreference è stato aggiornato e indica "controlla se il futuro ha uno stato condiviso". (Non sono sicuro se vuoi rimuovere il tuo secondo paragrafo o modificarlo, quindi non lo modificherò da solo). – Default

7

C'è una funzione membro is_ready in the works per std :: future. Nel frattempo, l'implementazione VC ha un membro _Is_ready().

Problemi correlati