Pourquoi devrais-je préférer l'un ou l'autre dans la pratique? Quelles sont les différences techniques si ce n'est que std::thread
est une classe?
Si vous souhaitez exécuter du code sur de nombreuses plates-formes, choisissez Posix Threads. Ils sont disponibles presque partout et sont assez matures. Par contre, si vous utilisez uniquement Linux/gcc std::thread
est parfait - il a un niveau d'abstraction plus élevé, une très bonne interface et fonctionne bien avec les autres classes C++ 11.
Le C++ 11 std::thread
_ class ne fonctionne malheureusement pas (encore) de manière fiable sur toutes les plateformes, même si C++ 11 semble disponible. Par exemple en natif Android std::thread
ou Win64, il ne fonctionne tout simplement pas ou présente de graves goulots d'étranglement en termes de performances (à partir de 2012).
Un bon remplacement est boost::thread
- il est très similaire à std::thread
(du même auteur) et fonctionne de manière fiable, mais introduit bien sûr une autre dépendance à partir d’une bibliothèque tierce.
Edit: à partir de 2017, std::thread
fonctionne principalement sur Android natif. Certaines classes, comme std::timed_mutex
ne sont toujours pas implémentés.
La bibliothèque std::thread
Est implémentée au-dessus des pthreads dans un environnement prenant en charge ces 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: verrous scoped, mutex récursifs, implémentations de modèles de conception futurs/promesses, etc.
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 la réponse associée https://stackoverflow.com/a/13135425/1158895 , std::thread
peut ne pas être encore complet sur toutes les plateformes. Même quand même (ce sera dans un proche avenir), il devrait être préféré à pthread
car il devrait permettre à votre application de mieux résister à l’avenir.
Pour moi, la différence technique décisive est l’absence de primitives de traitement du signal dans std par opposition à pthreads. L’incapacité de dicter correctement le traitement des signaux dans un processus Unix en utilisant std seul est un défaut grave, selon nous, de l’utilisation de std :: thread car il empêche de configurer le modèle de traitement des signaux multi-threads authentique pour traiter tous les signaux dans un environnement dédié. enfilez et bloquez-les dans le reste. Vous êtes obligé de supposer que std :: thread est implémenté à l'aide de pthreads et que tout se passe bien lorsque vous utilisez pthread_sigmask. Le traitement correct des signaux n'est pas négociable dans la programmation de systèmes Unix pour l'entreprise.
En 2016, std :: thread est un jouet. aussi simple que cela.
L'OpenMP
est une norme multithreading normalisée basée sur SMP qui fonctionne déjà depuis plus de 10 ans sous Linux et Windows. 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, 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.
Concurrence liée aux exigences de l’architecture logicielle 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 réels, au niveau du système d'exploitation, mais que les "threads verts" peuvent être simplement des "threads simulés" exécutés à l'aide d'un petit nombre de threads réels.