Parece que a menos que llame std::async
un std::future
Nunca se establecerá en cualquier otro estado que future_status::deferred
a menos que llame get
o wait
en el futuro. wait_for
& wait_until
continuará sin bloquear y devolver future_status::deferred
incluso si la tarea ya se ha ejecutado y almacenado el resultado.std :: futuro todavía diferida cuando se utiliza std :: packaged_task (VS11)
He aquí un ejemplo:
#include <future>
void main()
{
auto func = []() { return 5; };
auto asyncFuture = std::async(std::launch::async, func);
auto status = asyncFuture.wait_for(std::chrono::seconds(0)); // timeout (1)
auto deferredFuture = std::async(std::launch::deferred, func);
status = deferredFuture.wait_for(std::chrono::seconds(0)); // deferred (2)
std::packaged_task<int()> task(func);
auto packagedTaskFuture = task.get_future();
status = packagedTaskFuture.wait_for(std::chrono::seconds(0)); // deferred (2)
task();
status = packagedTaskFuture.wait_for(std::chrono::seconds(0)); // deferred (2)
packagedTaskFuture.wait();
status = packagedTaskFuture.wait_for(std::chrono::seconds(0)); // ready (0)
}
no tengo la corriente estándar de C++ 11, pero el proyecto de norma 30.6.9 dice que cuando se ejecuta un packaged_task
debe almacenar el resultado en el estado compartido del futuro. No está muy claro si eso incluye establecer el comportamiento esperado wait_until
/wait_for
o no.
No eran previamente problemas con el comportamiento VS11 en esta área con respecto a async
llamadas: http://social.msdn.microsoft.com/Forums/hu/parallelcppnative/thread/4394f2c1-0404-40df-869b-f4fc36fc035c
Además parece que otros compiladores tienen problemas en esta área: C++ 11 future_status::deferred not working
Cualquier persona que conozca el mejor estándar: ¿Es este comportamiento esperado o hay un problema con la implementación en VS11?
actualizaciones: De alguna manera se perdió el informe para esto: http://connect.microsoft.com/VisualStudio/feedback/details/761829/c-11-unexpected-behavior-for-std-future-wait-for-and-std-packaged-task
Desafortunadamente, el mismo estado diferido se obtiene mediante el uso de VS 11 - Actualización 1, cuando el futuro se obtiene de la promesa (funciona con asincrónico). El problema se les informó hace un tiempo, pero aún no está funcionando. Prácticamente se derrota el propósito de usar std :: future en muchos casos. Funciona con boost 1.51 al menos. – Ghita