Est-il possible de vérifier si un std::future
a terminé ou non ? Pour autant que je sache, la seule façon de le faire serait d'appeler wait_for
avec une durée de zéro et vérifier si l'état est ready
ou pas, mais y a-t-il un meilleur moyen ?
Réponses
Trop de publicités?Vous avez raison, et à part le fait d'appeler wait_until
avec un temps dans le passé (ce qui est équivalent), il n'y a pas de meilleur moyen.
Vous pouvez toujours écrire un petit wrapper si vous souhaitez 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, ceci ne retournera jamais vrai, donc il est probablement mieux de vérifier wait_for
directement dans le cas où vous souhaitez 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 cours de réalisation pour std::future. En attendant, l'implémentation VC possède un membre _Is_ready().
Mon premier pari serait de suivre wait_for
avec une durée de 0, et vérifiez le code de résultat qui peut être l'un des suivants future_status::ready
, future_status::deferred
o future_status::timeout
.
valid()
retournera true
si *this
fait référence à un état partagé, indépendamment du fait que cet état soit prêt ou non. Voir Référence cpp .