2012-06-05 18 views
49

¿Es posible verificar si un std::future ha finalizado o no? Por lo que puedo decir, la única forma de hacerlo sería llamar al wait_for con una duración cero y verificar si el estado es ready o no, pero ¿hay una mejor manera?Obtenga el estado de un estándar: futuro

+0

¿Buscar 'válido'? –

+6

@CatPlusPlus A menos que me equivoque, 'valid' solo comprueba si el futuro tiene un estado compartido (es decir, devuelve' true' hasta que 'get' se invoca en el futuro). –

+0

Entonces, si se ha llamado a 'get' y devuelve el valor almacenado, ¿todavía desea' true'? (No estoy seguro de por qué esto sería útil, ya que solo puede obtener el valor una vez). –

Respuesta

36

Tiene razón, y aparte de llamar al wait_until con un tiempo en el pasado (que es equivalente), no hay mejor manera.

Siempre se puede escribir un pequeño envoltorio si quieres una sintaxis más conveniente:

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. si la función se aplaza, nunca volverá a ser verdadera, por lo que probablemente sea mejor verificar wait_for directamente en el caso en que desee ejecutar la tarea diferida de forma síncrona después de que haya transcurrido un cierto tiempo o cuando la carga del sistema sea baja.

+1

wait_for no muta el futuro, por lo que el parámetro podría declararse como const. –

+1

Considere comprobar valid() primero para evitar errores de tiempo de ejecución si ya se llamó a get o el futuro nunca se inicializó. –

+2

¿Está garantizado que wait_for (chrono :: seconds (0)) devuelva inmediatamente o podría ceder el control del hilo durante algunos milisegundos en algunas implementaciones? Esto sería bastante importante saber que un par de milisegundos es mucho tiempo cuando se codifica un juego ... – kynnysmatto

6

Mi primera apuesta sería llamar wait_for con una duración 0, y compruebe el código de resultado que puede ser uno de future_status::ready, future_status::deferred o future_status::timeout.

En cppreference Afirman que valid()comprueba si el resultado está disponible, pero la norma dice que valid() volverá true si *this se refiere a un estado compartido, independientemente de si ese estado es listo o no.

+4

cppreference se ha actualizado y dice "comprueba si el futuro tiene un estado compartido". (No estoy seguro de si desea eliminar su segundo párrafo o editarlo, por lo que no voy a modificarlo yo mismo). – Default

7

Hay una función miembro is_ready in the works para std :: future. Mientras tanto, la implementación de VC tiene un miembro _Is_ready().

Cuestiones relacionadas