C++11 std::threads vs threads posix
Pourquoi devrais-je préfère l'un ou l'autre dans la pratique?
Quelles sont les différences techniques, sauf que std::thread
est une classe?
- Dans la pratique, vous devez utiliser
std::async
- Cette souffre des mêmes problèmes que
std::thread
n' - de compilateur de soutien de la vue, oui. à partir d'un point de vue technique il propose exception de la sécurité, qui
std::thread
oupthreads
ne le font pas. - Voté pour la réouverture. La demande pour les "différences techniques" rend cette objectivement responsable. Le haut de dépouillement indique que d'autres ont trouvé ce post constructif et utile.
- stackoverflow.com/questions/1273572/...
Vous devez vous connecter pour publier un commentaire.
Si vous voulez exécuter du code sur de nombreuses plates-formes, rendez-vous pour les Threads Posix. Ils sont disponibles presque partout et sont assez matures. D'autre part, si vous ne l'utilisez Linux/gcc
std::thread
est parfaitement bien: il a un niveau d'abstraction plus élevé, une très bonne interface et joue bien avec les autres C++11 classes.Le C++11
std::thread
classe, malheureusement, ne fonctionne pas de manière fiable (encore) sur chaque plate-forme, même si le C++11 semble disponible. Par exemple en natif Androidstd::thread
ou Win64 il n'a tout simplement pas de travail ou à de sérieux goulots d'étranglement des performances (en 2012).Un bon remplacement est
boost::thread
- il est très similaire àstd::thread
(en fait c'est à partir du même auteur) et fonctionne de manière fiable, mais, bien sûr, il introduit une autre dépendance d'un tiers de la bibliothèque.Edit: à compter de 2017,
std::thread
travaille essentiellement sur Android natif. Certaines classes, commestd::timed_mutex
sont toujours pas mises en œuvre.std::thread
et ses raii-style est bon, car il peut gérer les exceptions C++ alors que les pthreads ne peut pas sortir de la boîte.std::thread
lui-même semble fonctionner ok, liées à des classes commestd::condition_variable
etstd::mutex
beaucoup plus de temps. Le conflit est faible dans linux presque pas mesurable. J'ai utiliségcc-4.7.*
std::thread
ne fonctionne tout simplement pas à tous . Mais j'espère que cela changera bientôt.std::thread
est préférée - c'est beaucoup mieux abstration et joue très bien avec les autres fil classes en C++11, comme les mutex ou mêmestd::chrono
. Que et la "portabilité" était la raison pour laquelle je l'ai utilisé en premier lieu, que les piqûres à quelques reprises quand il s'agit de réels portage.std::thread
? Par rapport à MSVC je m'attends à une dégradation des performances, car ils utilisent un port de pthreads, mais MSVC devrait être correct.std::thread
maintenant et pour toujours. Il est multi-plateforme et un autre répondeur dit que c'est l'avenir et ne souffre pas de goulots d'étranglement des performances.La
std::thread
bibliothèque est mise en œuvre sur le dessus de pthreads dans un environnement de soutien 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++. Lestd::thread
bibliothèque comprend de nombreuses caractéristiques abstraites, par exemple: l'étendue des serrures, des récursive mutex, avenir/promesse modèle de conception mises en œuvre, et plus encore.+1
de moi pour souligner la chose la plus importante, à savoir que std::thread offre un niveau d'abstraction supérieur.std::thread
fournit la portabilité sur différentes plates-formes telles que Windows, MacOS et Linux.Comme mentionné par @hirshhornsalz dans les commentaires ci-dessous et liées réponse https://stackoverflow.com/a/13135425/1158895,
std::thread
peut ne pas être complet sur toutes les plates-formes encore. Encore que, (il sera dans un avenir proche), il devrait être favorisée par rapport àpthread
's parce qu'il devrait rendre votre application plus à l'avenir.boost::thread
sur Win64 ou Bionique (Android), parce questd::thread
manque encore de grandes pièces, où sur Linuxstd::thread
semble tout à fait mature.Pour moi de décider de la technique de la différence est l'absence de traitement de signal primitives dans les mst, par opposition à des pthreads. L'incapacité à correctement dicter de traitement de signal dans un processus Unix en utilisant std seul est autant que je sache, une grave faille de sécurité dans l'utilisation de std::thread, comme il l'un des bars de la mise en place de la bonne foi multi-thread de traitement de signal de modèle pour traiter tous les signaux dans un thread dédié et de les bloquer dans le reste. Vous êtes forcé de jouer std::thread est mis en œuvre à l'aide de pthreads et espérer pour le mieux lors de l'utilisation de pthread_sigmask. La manipulation des signaux correctement est non-négociable dans les systèmes Unix programmation pour l'entreprise.
À 2016, std::thread est un jouet; aussi simple que cela.
std::thread
apporte le type de sécurité que pthread n'ont pas.OpenMP
http://www.openmp.org/
est normalisée, la poudre de lait en fonction de multithreading norme
a été de travailler sur Linux et Windows pour plus d'une décennie déjà. OpenMP est disponible par défaut avec tous les compilateurs, y compris GCC et Microsoft Visual Studio.
Une chose à regarder dehors pour, lors de l'utilisation d'OpenMP, c'est que si il y a plus de threads qu'il y a de l'UC-cœurs, puis les performances vont diminuer en raison de la commutation de contexte généraux. La deuxième chose à garder à l'esprit est que l'initialisation d'un véritable système d'exploitation de niveau, le fil est relativement cher. L'initialisation est une fraction de seconde, mais, dans certaines applications, les très petites fractions accumuler à un
des dépenses considérables.
Pour l'architecture logiciel, les exigences liées à la simultanéité Vous souhaitez peut-être à la recherche de certains de la mise en œuvre de "léger threads" ou "fils verts" en lieu et place de l'utilisation d'OpenMP. La différence est que les threads OpenMP sont réels, au niveau système d'exploitation, les threads, mais le "green threads peut être juste "simulé threads" qui sont exécutés à l'aide de quelques petites certain nombre de threads.