¿Es posible comprobar si std::futureha finalizado o no? Por lo que puedo decir, la única forma de hacerlo sería llamar wait_forcon una duración cero y verificar si el estado es readyo no, pero ¿hay una mejor manera?
c++
multithreading
c++11
future
David Brown
fuente
fuente

validsolo comprueba si el futuro tiene un estado compartido (es decir, vuelvetruehasta quegetse llame al futuro).getha 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::isFinishedBásicamente, el equivalente de Qt .Respuestas:
Tiene razón, y aparte de llamar
wait_untilcon 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_fordirectamente 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_forcon una duración de 0 y verificar el código de resultado que puede ser uno defuture_status::ready,future_status::deferredofuture_status::timeout.En cppreference afirman que
valid()verifica si el resultado está disponible , pero el estándar dice quevalid()regresarátruesi se*thisrefiere a un estado compartido, independientemente de si ese estado está listo o no.fuente