C ++ 11 std :: threads vs threads posix

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

Si vous souhaitez exécuter du code sur de nombreuses plates-formes, optez pour les threads Posix. Ils sont disponibles presque partout et sont assez matures. D’un autre côté, si vous utilisez uniquement Linux / gcc std::thread est parfaitement correct – il a un niveau d’abstraction plus élevé, une très bonne interface et joue bien avec les autres classes C ++ 11.

La classe C ++ 11 std::thread 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 std::thread ou Win64 natif, il ne fonctionne tout simplement pas ou présente des goulots d’étranglement importants (à partir de 2012).

Un bon remplacement est boost::thread – il est très similaire à std::thread (en fait il provient 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: Depuis 2017, std::thread travaille principalement sur Android natif. Certaines classes, comme std::timed_mutex sont toujours pas implémentées.

La bibliothèque std::thread 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 bibliothèque std::thread comprend de nombreuses fonctionnalités abstraites, par exemple: les verrous de scope, les mutex récursifs, les implémentations de modèles de conception futures / prometteuses, etc.

std::thread permet 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 complet sur toutes les plates-formes pour le moment. Même encore (ce sera dans un avenir proche), il devrait être privilégié par rapport à pthread , car cela devrait rendre votre application plus pthread .

Pour moi, la différence technique décisive réside dans l’absence de primitives de traitement des signaux dans std, par opposition aux pthreads. L’incapacité à dicter correctement la gestion des signaux dans un processus Unix utilisant std seul est une faille débilitante dans l’utilisation de std :: thread car il empêche de configurer le schéma de gestion des signaux multi-threads pour traiter tous les signaux d’un fichier dédié. fil et les bloquer dans le rest. Vous êtes obligé de supposer que std :: thread est implémenté en utilisant pthreads et espère que vous utiliserez pthread_sigmask. Le traitement correct des signaux est non négociable dans la programmation des systèmes Unix pour l’entreprise.

En 2016, std :: thread est un jouet; aussi simple que cela.

L’OpenMP

http://www.openmp.org/

est un standard de multithreading normalisé basé sur SMP qui fonctionne sous Linux et Windows depuis plus de dix ans. 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 processeurs, les performances vont diminuer 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 au niveau du système d’exploitation réel 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’access concurrentiel à l’architecture logicielle Vous pouvez rechercher une implémentation de “threads légers” ou “threads verts” au lieu d’utiliser OpenMP. La différence est que les threads OpenMP sont réels, au niveau du système d’exploitation, des threads, mais les “threads verts” peuvent être juste des “threads simulés” exécutés en utilisant un petit nombre de threads réels.