Quelqu'un peut-il donner une intuition de haut niveau sur le moment d'utiliser chacun d'eux?
Les références:
Ce n'est pas vraiment une chose ni - ni - vous pouvez utiliser des futures (avec des promesses) avec des threads std :: créés manuellement. En utilisant std::async
est un moyen pratique de déclencher un thread pour certains calculs asynchrones et de rassembler le résultat via un futur mais std::async
est plutôt limité dans la norme actuelle. Il deviendra plus utile si les extensions suggérées pour incorporer certaines des idées de Microsoft PPL sont acceptées.
Actuellement, std::async
est probablement le mieux adapté pour gérer des calculs très longs ou de longue durée IO pour les programmes assez simples. Il ne garantit cependant pas un faible temps système (et en fait, la façon dont il est spécifié le rend difficile à implémenter avec un pool de threads en arrière-plan), il n'est donc pas bien adapté aux charges de travail plus fines. Pour cela, vous devez soit rouler vos propres pools de threads à l'aide de std::thread
ou utilisez quelque chose comme Microsoft PPL ou TBB d'Intel.
Vous pouvez aussi utiliser std::thread
pour le code de style de thread POSIX "traditionnel" écrit de manière plus moderne et portable.
Bartosz Milewski discute de certaines des limites de la façon dont std::async
est actuellement spécifié dans son article Tâches asynchrones en C++ 11: pas encore là
Une raison simple que j'ai trouvée est le cas lorsque vous voulez un moyen de détecter (via l'interrogation) si un travail asynchrone est effectué. Avec std::thread
, Vous devez le gérer vous-même. Avec std::async
, Vous pouvez interroger std::future::valid()
(ou utiliser std::future::wait_for/wait_until(...)
) pour savoir quand c'est fait.