Il semble que si vous appelez un std::async
std::future
ne sera jamais réglé à tout autre état que future_status::deferred
sauf si vous appelez get
ou wait
sur l'avenir. wait_for
& wait_until
continuera à ne pas bloquer et retourner future_status::deferred
même si la tâche a déjà exécuté et stocké le résultat.std :: avenir encore différé lors de l'utilisation std :: packaged_task (VS11)
Voici un exemple:
#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)
}
Je n'ai pas la norme actuelle 11 C++, mais le projet de norme 30.6.9 dit que lorsqu'un packaged_task
est lancé, il doit stocker le résultat dans la l'état partagé du futur. Il n'est pas très clair si cela inclut la définition du comportement wait_until
/wait_for
attendu ou non.
Il y avait déjà des problèmes avec le comportement de VS11 dans ce domaine par rapport à async
appels: http://social.msdn.microsoft.com/Forums/hu/parallelcppnative/thread/4394f2c1-0404-40df-869b-f4fc36fc035c
De plus il semble que d'autres compilateurs ont des problèmes dans ce domaine: C++ 11 future_status::deferred not working
Toute personne qui peut connaître la norme mieux: Est-ce un comportement attendu ou existe-t-il un problème avec la mise en œuvre dans VS11?
Mises à jour: Je le rapport en quelque sorte manqué pour cela: http://connect.microsoft.com/VisualStudio/feedback/details/761829/c-11-unexpected-behavior-for-std-future-wait-for-and-std-packaged-task
Le même statut différé est malheureusement obtenu en utilisant VS 11 - Update 1, lorsque le futur est obtenu à partir de promesse (cela fonctionne avec async). Le problème leur a été signalé il y a quelque temps, mais il ne fonctionne toujours pas. Il est pratiquement inutile d'utiliser std :: future dans de nombreux cas. Fonctionne avec boost 1,51 au moins. – Ghita