Je veux apprendre multi-threading en C ++, mais je ne suis pas sûr de quel type serait le plus utile. Ceux que j'ai vu des tutoriels sont: p>
(Je suis sûr qu'il y a probablement plus.) p>
Quelles sont les caractéristiques essentielles de chacun et que sont-elles utilisées le mieux? P>
Remarque: J'ai déjà fait du multi-threading en C # en créant manuellement les threads, et une complexité plus complexe du threading le rendra simplement plus amusant. :) p>
4 Réponses :
Je commencerais avec Pthreads si vous avez plus d'antécédents C, ou booster le fil si vous êtes habitué à plus idiomatique C ++. Soit raisonnablement portable et largement utilisé. P>
Si vous voulez être portable em>, apprendre les threads POSIX. Vous savez, toutes les bibliothèques de fil offrent plus ou moins le même ensemble de fonctionnalités. C'est donc à vous de décider, mais POSIX vous donnera la base. P>
OpenMP n'est pas exactement "multi-threading" comme vous voulez le dire. P>
Hmm Pthreads a bien l'air bien, la seule chose que c'est de c, maintenant ma conférence dit ne mélange pas c en C ++ parce que c'était un mauvais (au moins avec la gestion de la mémoire) Pensez-vous que cela importerait?
Vous avez une définition intéressante de "portable" si vous envisagez que l'option la plus portable soit celle qui ne fonctionne pas sur 90% du PC des personnes. ;) Quoi qu'il en soit, en C, Pthreads sont le standard de facteur de la définition partout sauf Windows, qui a son propre API de threading. En C ++, Boost.thread est votre meilleur choix (il est portable, c'est idiomatique C ++, et cela a été une forte inspiration pour la fonctionnalité de filetage ajoutée à la langue en C ++ 11.
@ JALF: Merci, je pensais que Boost serait le meilleur de la réponse de John, connaissez-vous de bons tutoriels ou d'exemple de code pour me lancer sur une bonne conception de threading OO?
@Quantumkarl: Qu'est-ce que OO a à voir avec quoi que ce soit? Les documents Boost.thread ont quelques exemples de la manière d'utiliser la bibliothèque. Quant à la façon dont vous structurez votre code? De la même manière que vous structions tout autre code.
@JAlf: OK, je ne savais pas si Oo threading différerait, puisque l'un des tutoriels que j'ai examinés pour #include
Certaines personnes vont gifler une étiquette "OO" sur tout ce qui est absolument. Bon design est bon design. Que ce soit ou non "OO" est insignifiant. Et surtout en C ++, OO est souvent la mauvaise façon d'aller. Boost.thread n'est pas particulièrement orienté objet, car cela aurait rendu moins générique, plus lent et moins de sécurité. C'est souvent comment ça se passe en C ++. Donc, en général, posez-vous à propos de Bon design I>, pas Good Oo Design i>. rant> code>
@CICADA: Pouvez-vous élaborer pourquoi OpenMP n'est pas multithreading en tant que op le signifiait?
WinThreads (Windows) et Pthreads (Linux) sont des threads POSIX et représentent probablement votre meilleur choix pour commencer. Il est important d'apprendre la distinction entre les processus et les threads, puis découvrez les différents modèles d'accès à la mémoire qui leur sont associés. Ensuite, essayez des approches de concurrence comme OpenMP et MPI "threads". P>
Il y a quelques concepts de base qui seront répétés. Les apprendre bien. P>
Que diriez-vous de tbb ? Il est portable et a facile à utiliser des motifs de modèle parallèles, des conteneurs simultanés, un planificateur de tâches et des allocateur de mémoire évolutif. TBB vous permettra de gérer directement des threads, mais cela n'est pas nécessaire dans la plupart des cas. P>
Personnellement, je resterais à l'écart des threads spécifiques à la plate-forme, sauf si une nécessité urgente de faire quelque chose, de bien, de la plate-forme spécifique. P>
Les fils de boost sont portables et faciles à utiliser, mais n'ont ni des motifs parallèles ni des conteneurs simultanés. Vous auriez besoin de threads manifestant manuellement, qui peuvent devenir laids assez rapidement. P>
Pthreads n'est pas disponible sur Windows et ses C. Vous voulez vraiment faire de multi-threading en C ++, pas C. Raii se mélange bien avec des mutexes et des serrures scopées. P>
Une autre option est ppl dans Visual C ++ 2010. Il est similaire à TBB, mais comme vous pouvez le deviner uniquement pour Windows uniquement. P>
OpenMP est facile à utiliser, mais pas très flexible. Puisque vous avez déjà appris C ++, vous devez utiliser quelque chose de plus grave, tel que TBB ou PPL. Pour une raison étrange, Visual C ++ 2010 ne prend pas en charge OpenMP 3. Dommage. P>
TBB a l'air intéressant. Cela fonctionne sur toutes les marques de puce non? Savez-vous à quel point il est efficace que c'est comparé à Boost :: threads? Raii semble très intéressant aussi. J'ai beaucoup d'apprentissage / lecture de TODO. Pensez que je vais passer sur PPL mais pas trop désireuse de 2010. Merci! PS Je suis d'accord avec faire les threads en C ++, C ++ est ce que je veux apprendre et lors de la fabrication de projets C ++ Pourquoi mélanger en C?
J'ai corrigé votre message, puisque vous ne pouviez manifestez clairement pas de passer du temps à l'écrire correctement. :(