web-dev-qa-db-fra.com

Quand utiliser std :: async vs std :: threads?

41
Javi V

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à

33
mattnewport

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.

5
Robert