web-dev-qa-db-fra.com

Obtenez le statut d'un std :: future

Est-il possible de vérifier si un std::future a fini ou pas? Pour autant que je sache, la seule façon de le faire serait d'appeler wait_for avec une durée nulle et vérifiez si le statut est ready ou non, mais existe-t-il une meilleure solution?

67
David Brown

Vous avez raison, et à part appeler wait_until avec un temps dans le passé (qui est équivalent) il n'y a pas de meilleur moyen.

Vous pouvez toujours écrire un petit wrapper si vous voulez une syntaxe plus pratique:

template<typename R>
  bool is_ready(std::future<R> const& f)
  { return f.wait_for(std::chrono::seconds(0)) == std::future_status::ready; }

N.B. si la fonction est différée, cela ne retournera jamais vrai, il est donc préférable de vérifier wait_for directement dans le cas où vous pourriez vouloir exécuter la tâche différée de manière synchrone après un certain temps ou lorsque la charge du système est faible.

66
Jonathan Wakely

Il y a une fonction membre is_ready en préparation pour std :: future. En attendant, l'implémentation VC a un membre _Is_ready ().

10
Rick Yorgason

Mon premier pari serait d'appeler wait_for Avec une durée de 0 et de vérifier le code de résultat qui peut être l'un de future_status::ready, future_status::deferred Ou future_status::timeout.

Dans cppreference ils affirment que valid() vérifie si le résultat est disponible , mais la norme dit que valid() renverra true si *this fait référence à un état partagé, que cet état soit prêt ou pas.