C ++ 11 std :: fil vs fenêtres CreateThread
Quelle est la meilleure option pour la création (et la gestion des threads sous Visual C++: C++11 std::thread
ou WinAPI
fonctions (telles que CreateThread
_beginthreadex
etc.) et pourquoi?
source d'informationauteur KaMyLuS
Vous devez vous connecter pour publier un commentaire.
Portabilité
std::thread
est nouveau C++11 standard - avec elle, vous pouvez écrire du code portable en C++ à travers les compilateurs d'appui de C++11. Vous pouvez sentir lafuture
.Il est basé sur
boost::thread
qui prend en charge les compilateurs plus âgés ont pas l'appui de C++11 est - ce qui rend le portage sur d'autres plateformes est encore plus facile.Si vous avez besoin de l'utilisation de la plate-forme des tours,
std::thread::native_handle
est le chemin à parcourir.CreateThread
est spécifique à WinAPI, ce qui implique l'écriture de code non portable. Aussi, cette API est assez vieux et le plus pratique à utiliser.RAII
WinAPI est une API en C qui n'encourage pas moderne C++ bon pratiques. Chaque filetage primitive que vous créez, vous devez plus tard détruire manuellement.
Ce n'est pas le cas pour la bibliothèque de threads en C++11, et de ce fait, des abstractions de niveau supérieur plus facile à écrire. Alors que
std::thread
est encore assez bas niveau (soit vous.join()
ou.detach()
votre fil ou le fil destructeur permettra de mettre fin à votre programme), le C++11 filetage de la bibliothèque astd::lock_guard
et d'autres verrouiller des classes pour soutenir RAII pour les mutex.Tandis que le C++11 a certaines abstractions de niveau supérieur, comme
std::async
pour le lancement des fonctions de façon asynchrone, il ne fournit pas d'autres abstractions comme threadpools, de sorte que vous pouvez utiliser d'autres bibliothèques.De sécurité de Type
WinAPI peut appeler uniquement des pointeurs de fonction avec signature spécifique - qui est sujette à des bugs liés à la sécurité du type, de la durée de vie des objets et de la mauvaise gestion de la mémoire.
std::thread
pouvez appeler n'importe quel objet appelable:TL;DR: Il n'y a pas de raison d'utiliser WinAPI fils comme le principal mécanisme de threading dans le nouveau code C++.
De la croix-platformity est un petit avantage. Le réel avantage est dans l'interface.
std::thread
offre RAII-garanties pour le nettoyage du fil, et prend en charge arbitraire de la fonction de l'objet des arguments au lieu de juste des pointeurs de fonction.std::thread
est le C++11 wrapper sur CreateThreadEX et c'est pour une bonne raison.Tout comme une note de côté, std::thread est un terrible, terrible API. Si vous êtes à la création de threads que vous, vous êtes probablement de faire le mal. Utiliser un vrai filetage API comme Intel TBB ou de Microsoft PPL, qui sont très supérieure à la terrible
std::thread
et en quelque sorte encore pire CreateThreadEx.std::thread
est comme, "Hey les gars, je vous offre de la croix-plate-formemmap
de sorte que vous pouvez écrire votre propremalloc
sur le dessus, profitez-en!".Vous devriez probablement utiliser std::thread.
std::thread est une partie de la (nouvelle) standard, et est portable.
Sauf si vous êtes seulement en ciblant Windows ET que vous avez besoin d'interagir avec votre fils à l'aide de la WinAPI, std::thread est le chemin à parcourir.