- il est appelé asynchrone, mais il a un comportement vraiment "séquentiel",
Non, si vous utilisez la politique std::launch::async
alors cela s'exécute de manière asynchrone dans un nouveau thread. Si vous ne spécifiez pas de politique, cela pourrait s'exécuter dans un nouveau thread.
essentiellement, dans la ligne où vous appelez le futur associé à votre fonction asynchrone foo, le programme se bloque jusqu'à ce que l'exécution de foo soit terminée.
Cela ne se bloque que si foo n'est pas terminé, mais s'il a été exécuté de manière asynchrone (par exemple, en utilisant la politique std::launch::async
`
- cela dépend de la même bibliothèque externe que d'autres, et surtout, de meilleures solutions non bloquantes, ce qui signifie pthread, si vous voulez utiliser std::async vous avez besoin de pthread.
`
``
Faux, cela n'a pas besoin d'être implémenté en utilisant Pthreads (et sur Windows ce n'est pas le cas, cela utilise les fonctionnalités ConcRT.)
à ce stade, il est naturel pour moi de me demander pourquoi choisir std::async plutôt qu'un simple ensemble de foncteurs ?
Parce que cela garantit la sûreté de thread et propage les exceptions entre les threads. Pouvez-vous faire ça avec un simple ensemble de foncteurs ?
C'est une solution qui ne se met même pas à l'échelle du tout, plus vous appelez de futurs, moins votre programme sera réactif.
Pas nécessairement. Si vous ne spécifiez pas la politique de lancement alors une implémentation intelligente peut décider s'il faut démarrer un nouveau thread, ou renvoyer une fonction différée, ou renvoyer quelque chose qui décidera plus tard, lorsque plus de ressources seront disponibles.
Maintenant, il est vrai qu'avec l'implémentation de GCC, si vous ne fournissez pas de politique de lancement alors avec les versions actuelles cela ne s'exécutera jamais dans un nouveau thread (il y a un rapport bugzilla pour cela) mais c'est une propriété de cette implémentation, pas de std::async
en général. Ne confondez pas la spécification dans la norme avec une implémentation particulière. Lire l'implémentation d'une bibliothèque standard est une mauvaise façon d'apprendre sur le C++11.
Pouvez-vous montrer un exemple qui est garanti d'être exécuté de manière asynchrone, non bloquante ?
Cela ne devrait pas se bloquer :
auto fut = std::async(std::launch::async, doSomethingThatTakesTenSeconds);
auto result1 = doSomethingThatTakesTwentySeconds();
auto result2 = fut.get();
En spécifiant la politique de lancement, vous forcez l'exécution asynchrone, et si vous faites d'autres travaux pendant son exécution alors le résultat sera prêt lorsque vous en aurez besoin.
``