2012-10-08 15 views
9

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

+0

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

Respuesta

12

Este es un problema con VS2012. Tampoco es el único problema --- su implementación de la biblioteca de hilos C++ 11 tiene varios errores. Escribí unos pocos on my blog.

+0

Gracias! Sabía que el soporte VS11 C++ 11 STL no era tan bueno, pero no pensé que sería completamente inutilizable. ¿Algún comentario sobre la implementación de estas características de boost (obviamente no asincrónico o cosas que aún no han implementado)? –

+0

La implementación de impulso generalmente es buena para las funciones implementadas. Hay algunos errores, pero estamos trabajando en ellos, y Vicente está trabajando en las características que faltan en C++ 11. –

+0

@AnthonyWilliams Gracias por el soporte de refuerzo. Es algo en lo que se puede confiar para este – Ghita

Cuestiones relacionadas