È 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
risposta
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.
wait_for non muta il futuro in modo che il parametro possa essere dichiarato come const. –
Considerare innanzitutto il controllo valid() per evitare errori di run time se get è stato già chiamato o il futuro non è mai stato inizializzato. –
È 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
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.
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
C'è una funzione membro is_ready in the works per std :: future. Nel frattempo, l'implementazione VC ha un membro _Is_ready().
- 1. Propagazione di eccezioni e std :: future
- 2. Ottenere lo stato di JToggleButton
- 3. Come verificare lo stato di uno storyboard?
- 4. Sta chiamando wait() su uno std :: future più volte e da più thread sicuri?
- 5. Rcpp imposta lo stato RNG su uno stato precedente
- 6. Come viene allocata la memoria associata a std :: future?
- 7. Come ottenere lo stato di download?
- 8. Problema ottenere lo stato di avanzamento di uno SQL-Server processo di ripristino
- 9. Come ottenere il primo elemento di uno std :: set
- 10. Come impostare lo stato di uscita in uno script Groovy
- 11. Ottenere lo stato dell'istanza EC2 API Java
- 12. Ottenere lo stato dello schermo usando ADB
- 13. Ottenere lo stato del sistema in python
- 14. Quando lo std :: reference_wrapper è stato convertito in T &?
- 15. Lettura diretta da uno std :: istream in uno std :: string
- 16. Come posso ottenere lo stato di download <script>?
- 17. È stato svuotato uno shared-from shared_ptr?
- 18. Come fa 'ottenere' effettivamente/ottenere/lo stato iniziale in Haskell?
- 19. Ottenere uno std :: thread da staccare e terminare da solo
- 20. Come verificare se lo stato corrente in ui-router è figlio di uno stato astratto
- 21. C'è un modo per intersecare/diff uno std :: map e uno std :: set?
- 22. Come ottenere lo stato di "Invoke-Expression", riuscito o fallito?
- 23. Come ottenere lo stato di build da GitLab CI?
- 24. Come ottenere lo stato di roaming in IOS
- 25. Come ottenere lo stato corrente di una connessione websocket javascript
- 26. std :: condition_variable perché ha bisogno di uno std :: mutex
- 27. Stampa di uno std :: array di
- 28. Assegnare un std :: vector a uno std :: valarray
- 29. Come ottenere lo stato della rete del sistema in Qt?
- 30. C++ in uno std :: vector
Verificare la presenza di 'valido'? –
@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). –
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.) –