2012-10-08 1 views
9

Il semble que si vous appelez un std::asyncstd::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

+0

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

Répondre

12

Ceci est un problème avec VS2012. Ce n'est pas le seul problème non plus --- leur implémentation de la bibliothèque de threads C++ 11 a plusieurs bogues. J'ai écrit à propos de quelques on my blog.

+0

Merci! Je savais que le support VS11 C++ 11 STL n'était pas génial, mais je ne pensais pas que ce serait complètement inutilisable. Des commentaires sur l'implémentation de boost de ces fonctionnalités (évidemment non asynchrones ou des choses qu'ils n'ont pas encore implémentées)? –

+0

L'implémentation de boost est généralement bonne, pour les fonctionnalités implémentées. Il y a quelques bugs, mais nous travaillons dessus, et Vicente travaille sur les fonctionnalités manquantes de C++ 11. –

+0

@AnthonyWilliams Merci pour le soutien de boost. C'est quelque chose qui peut être invoqué pour cela – Ghita

Questions connexes