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?
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.
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 ().
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.