¿Es posible comprobar si std::future
ha finalizado o no? Por lo que puedo decir, la única forma de hacerlo sería llamar wait_for
con una duración cero y verificar si el estado es ready
o no, pero ¿hay una mejor manera?
c++
multithreading
c++11
future
David Brown
fuente
fuente
valid
solo comprueba si el futuro tiene un estado compartido (es decir, vuelvetrue
hasta queget
se llame al futuro).get
ha sido llamado y devuelve el valor almacenado, ¿aún lo deseatrue
? (No estoy seguro de por qué esto sería útil, ya que solo puede obtener el valor una vez).QFuture::isFinished
Básicamente, el equivalente de Qt .Respuestas:
Tiene razón, y aparte de llamar
wait_until
con un tiempo en el pasado (que es equivalente) no hay mejor manera.Siempre puede escribir una pequeña envoltura si desea 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; }
Nota: si la función se aplaza, esto nunca volverá a ser verdadero, por lo que probablemente sea mejor verificar
wait_for
directamente en el caso de que desee ejecutar la tarea aplazada de forma sincrónica después de que haya pasado un cierto tiempo o cuando la carga del sistema sea baja.fuente
for(int i = 0; i < 1000; i++) f.wait_for(chrono::seconds(0));
toma 43 ms de tiempo de reloj de pared.Hay una función miembro is_ready en proceso para std :: future. Mientras tanto, la implementación de VC tiene un miembro _Is_ready ().
fuente
Mi primera apuesta sería igualar
wait_for
con una duración de 0 y verificar el código de resultado que puede ser uno defuture_status::ready
,future_status::deferred
ofuture_status::timeout
.En cppreference afirman que
valid()
verifica si el resultado está disponible , pero el estándar dice quevalid()
regresarátrue
si se*this
refiere a un estado compartido, independientemente de si ese estado está listo o no.fuente