C ++ 11 std :: threads vs threads posix

157

Pourquoi devrais-je préférer l'un ou l'autre en pratique? Quelles sont les différences techniques sauf que std::threadc'est une classe?

Shamdor
la source
5
En pratique, vous devriez utiliserstd::async
Stephan Dollberg
Ce @bamboon souffre des mêmes problèmes que std::threadfait
Gunther Piez
2
@hirschhornsalz depuis la vue du support du compilateur, oui. d'un point de vue technique, il offre une sécurité d'exception, qui std::threadou pthreadsnon.
Stephan Dollberg
15
A voté pour la réouverture. La demande de "différences techniques" rend cela objectivement responsable. Le nombre élevé de votes indique que d'autres ont trouvé ce message constructif et utile.
Adrian McCarthy
stackoverflow.com/questions/1273572/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Réponses:

122

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::threadc'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::threadclasse 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::threadou 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::threadfonctionne principalement sur Android natif. Certaines classes, comme ne std::timed_mutexsont toujours pas implémentées.

Gunther Piez
la source
19
Avez-vous des preuves pour étayer ces allégations de «goulot d'étranglement des performances»? De plus, std::threadson style raii est bon car il peut gérer les exceptions C ++ alors que les pthreads ne peuvent pas sortir de la boîte.
Jesse Good
9
Maintenant en 2014, cette réponse est-elle toujours valable?
nonsensation
25
Et maintenant, début 2017?
rmobis le
9
Et maintenant, en 2017 Middle?
Courses de légèreté en orbite le
14
Et maintenant, en 2018 Middle?
陳 力
59

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::threadest une bibliothèque de classes C ++. La std::threadbibliothèque comprend de nombreuses fonctionnalités abstraites, par exemple: verrous étendus, mutex récursifs, implémentations de modèles de conception future / promise, etc.

Akira Takahashi
la source
4
+1de ma part pour avoir souligné la chose la plus importante, à savoir que std :: thread offre un niveau d'abstraction plus élevé.
sbi
33

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::threadpeut 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é à pthreadcelui car il devrait rendre votre application plus pérenne.

Brady
la source
2
en fait, std :: threads fournit la portabilité sur toutes les plates-formes qui prennent en charge C ++ 11, alors que les threads POSIX ne sont disponibles que sur les plates-formes POSIX (ou les plates-formes qui s'efforcent d'obtenir une compatibilité minimale).
Tobias Langner
1
Du point de vue pratique, c'est tout simplement faux. J'ai en fait décidé il y a quelques mois sur ce raisonnement - c'était une erreur majeure. En pratique, vous devez utiliser boost::threadsur Win64 ou Bionic (Android), car std::threadil manque encore de grandes pièces, où sur Linux std::threadsemble assez mature.
Gunther Piez
1
@hirschhornsalz, le but de ma réponse est de souligner l'avantage de la portabilité fourni par l'implémentation du thread c ++ 11 par rapport à pthread. L'OP n'a pas posé de questions sur le boost, mais aussi sur son portable.
Brady
3
@hirschhornsalz, quant à votre ton négatif et à votre accusation de ne jamais utiliser de fils, ils sont tout simplement non destructifs et ne méritent pas beaucoup d'efforts de ma part. Je pense qu'il vaut au moins la peine de mentionner qu'un commentaire plus constructif aurait été de signaler les problèmes que vous avez rencontrés en essayant d'utiliser std :: thread sur différentes plates-formes.
Brady
3
Pour résumer, c ++ 11 std :: thread n'est utilisable qu'avec les versions récentes de GCC. Il n'est pas presque terminé dans Visual Studio, donc non utilisable sous Windows. Et bien sûr, il est absolument absent des compilateurs commerciaux sous UNIX (Sun Studio sur Solaris, HP aCC sur HP-UX, IBM vacpp sur AIX). Par conséquent, si votre plate-forme cible est uniquement Linux - c ++ 11 std :: thread est très bien; si vous avez également besoin de Windows ou d'un autre UNIX - boost :: thread est la solution.
vond
7

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.

Waslap
la source
7
Je ne suis pas d'accord. Et l'utilisation intensive des signaux est un modèle de conception qui peut être évité pour la plupart des applications.
Erik Alapää
En outre, std::threadapporte une sécurité de type que pthread n'a pas.
alfC
-3

L'OpenMP

http://www.openmp.org/

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.

Martin Vahi
la source
6
Pas de manque de respect, mais comment est-ce lié à la question principale?
SRG le