Pourquoi devrais-je préférer l'un ou l'autre en pratique? Quelles sont les différences techniques sauf que std::thread
c'est une classe?
std::thread
fait
std::thread
ou pthreads
non.
Pourquoi devrais-je préférer l'un ou l'autre en pratique? Quelles sont les différences techniques sauf que std::thread
c'est une classe?
std::thread
fait
std::thread
ou pthreads
non.
Réponses:
Si vous souhaitez exécuter du code sur de nombreuses plates-formes, optez pour Posix Threads. Ils sont disponibles presque partout et sont assez matures. D'un autre côté, si vous n'utilisez que Linux / gcc, std::thread
c'est parfaitement bien - il a un niveau d'abstraction plus élevé, une très bonne interface et joue bien avec d'autres classes C ++ 11.
La std::thread
classe C ++ 11 ne fonctionne malheureusement pas (encore) de manière fiable sur toutes les plates-formes, même si C ++ 11 semble disponible. Par exemple, dans Android natif std::thread
ou Win64, il ne fonctionne tout simplement pas ou présente de graves goulots d'étranglement de performances (à partir de 2012).
Un bon remplacement est boost::thread
- il est très similaire à std::thread
(en fait il est du même auteur) et fonctionne de manière fiable, mais, bien sûr, il introduit une autre dépendance à partir d'une bibliothèque tierce.
Edit: À partir de 2017, std::thread
fonctionne principalement sur Android natif. Certaines classes, comme ne std::timed_mutex
sont toujours pas implémentées.
std::thread
son style raii est bon car il peut gérer les exceptions C ++ alors que les pthreads ne peuvent pas sortir de la boîte.
le std::thread
bibliothèque est implémentée au-dessus de pthreads dans un environnement prenant en charge pthreads (par exemple: libstdc ++).
Je pense que la grande différence entre les deux est l'abstraction. std::thread
est une bibliothèque de classes C ++. La std::thread
bibliothèque comprend de nombreuses fonctionnalités abstraites, par exemple: verrous étendus, mutex récursifs, implémentations de modèles de conception future / promise, etc.
+1
de ma part pour avoir souligné la chose la plus importante, à savoir que std :: thread offre un niveau d'abstraction plus élevé.
std::thread
offre la portabilité sur différentes plates-formes telles que Windows, MacOS et Linux.
Comme mentionné par @hirshhornsalz dans les commentaires ci-dessous et la réponse associée https://stackoverflow.com/a/13135425/1158895 , std::thread
peut ne pas être encore complet sur toutes les plates-formes. Même encore, (ce sera dans un proche avenir), il devrait être préféré à pthread
celui car il devrait rendre votre application plus pérenne.
boost::thread
sur Win64 ou Bionic (Android), car std::thread
il manque encore de grandes pièces, où sur Linux std::thread
semble assez mature.
Pour moi, la différence technique décisive est l'absence de primitives de gestion du signal dans std par opposition aux pthreads. L'incapacité de dicter correctement la gestion du signal dans un processus Unix utilisant std seul est AFAIK une faille débilitante dans l'utilisation de std :: thread car elle empêche la configuration du modèle de gestion de signal multithread de bonne foi pour traiter tous les signaux dans un fil et les bloquer dans le reste. Vous êtes obligé de supposer que std :: thread est implémenté en utilisant pthreads et espérez le meilleur lorsque vous utilisez pthread_sigmask. La gestion correcte des signaux n'est pas négociable dans la programmation des systèmes Unix pour l'entreprise.
En 2016, std :: thread est un jouet; aussi simple que cela.
std::thread
apporte une sécurité de type que pthread n'a pas.
L'OpenMP
est un standard multithreading standardisé basé sur SMP qui fonctionne déjà sous Linux et Windows depuis plus d'une décennie. L'OpenMP est disponible par défaut avec tous les compilateurs, y compris GCC et Microsoft Visual Studio.
Une chose à surveiller, lors de l'utilisation d'OpenMP, est que s'il y a plus de threads qu'il n'y a de cœurs de processeur, alors les performances diminueront en raison de la surcharge liée au changement de contexte. La deuxième chose à garder à l'esprit est que l'initialisation d'un thread réel, au niveau du système d'exploitation, est relativement coûteuse. L'initialisation est une fraction de seconde, mais dans certaines applications, les très petites fractions s'accumulent à un coût considérable.
Pour les exigences d'architecture logicielle liées à la concurrence Vous pouvez rechercher une implémentation de "threads légers" ou de "threads verts" au lieu d'utiliser OpenMP. La différence est que les threads OpenMP sont des threads réels, au niveau du système d'exploitation, mais les "threads verts" peuvent être simplement des "threads simulés" qui sont exécutés en utilisant un petit nombre de threads réels.
std::async