Quelqu'un peut-il publier un exemple simple de démarrage de deux threads (orientés objet) en C ++.
Je recherche des objets de thread C ++ réels sur lesquels je peux étendre les méthodes d'exécution (ou quelque chose de similaire) au lieu d'appeler une bibliothèque de threads de style C.
J'ai omis toutes les demandes spécifiques au système d'exploitation dans l'espoir que celui qui répondrait répondrait avec les bibliothèques multiplateformes à utiliser. Je ne fais que rendre cela explicite maintenant.
Réponses:
Créez une fonction que vous souhaitez que le thread exécute, par exemple:
Créez maintenant l'
thread
objet qui appellera finalement la fonction ci-dessus comme ceci:(Vous devez
#include <thread>
accéder à lastd::thread
classe)Les arguments du constructeur sont la fonction que le thread exécutera, suivie des paramètres de la fonction. Le fil démarre automatiquement lors de la construction.
Si plus tard vous voulez attendre que le thread ait fini d'exécuter la fonction, appelez:
(La jointure signifie que le thread qui a appelé le nouveau thread attendra la fin de l'exécution du nouveau thread, avant de poursuivre sa propre exécution).
Le code
Plus d'informations sur std :: thread ici
-std=c++0x -pthread
.la source
-std=c++0x
(au lieu de-std=c++0x
)" Je pense que le deuxième "c ++ 0x" devrait plutôt être "c ++ 11", mais ce n'est pas possible de le changer car la modification est trop petite.task1
. Ainsi, le pointeur de fonction est également désigné partask1
. Mais merci d'avoir soulevé cette question parce que je crois que j'avais tort et que c'est équivalent à&task1
, donc peu importe la forme que vous choisissez d'écrire (si c'est le cas, je suppose que pointeur à pointeur de la fonction est&&task1
- ce serait mauvais ). Question pertinente .Eh bien, techniquement, un tel objet finira par être construit sur une bibliothèque de threads de style C car C ++ vient de spécifier un
std::thread
modèle de stock en c ++ 0x, qui vient d'être cloué et n'a pas encore été implémenté. Le problème est quelque peu systémique, techniquement, le modèle de mémoire c ++ existant n'est pas assez strict pour permettre une sémantique bien définie pour tous les cas «avant». Hans Boehm a écrit un article sur le sujet il y a quelque temps et a joué un rôle déterminant dans l'élaboration de la norme c ++ 0x sur le sujet.http://www.hpl.hp.com/techreports/2004/HPL-2004-209.html
Cela dit, il existe plusieurs bibliothèques C ++ de threads multiplateforme qui fonctionnent très bien dans la pratique. Les blocs de construction de threads Intel contiennent un objet tbb :: thread qui se rapproche étroitement de la norme c ++ 0x et Boost a une bibliothèque boost :: thread qui fait de même.
http://www.threadingbuildingblocks.org/
http://www.boost.org/doc/libs/1_37_0/doc/html/thread.html
En utilisant boost :: thread, vous obtiendrez quelque chose comme:
la source
Il existe également une bibliothèque POSIX pour les systèmes d'exploitation POSIX. Vérifier la compatibilité
compiler avec -lpthread
http://en.wikipedia.org/wiki/POSIX_Threads
la source
la source
Lorsque vous recherchez un exemple d'une classe C ++ qui appelle l'une de ses propres méthodes d'instance dans un nouveau thread, cette question se pose, mais nous n'avons pas pu utiliser l'une de ces réponses de cette façon. Voici un exemple qui fait cela:
Class.h
Class.cpp
Notez que cet exemple n'entre pas dans le mutex ou le verrouillage.
la source
À moins que l'on veuille une fonction distincte dans les espaces de noms globaux, nous pouvons utiliser des fonctions lambda pour créer des threads.
L'un des principaux avantages de la création de thread à l'aide de lambda est que nous n'avons pas besoin de transmettre les paramètres locaux sous forme de liste d'arguments. Nous pouvons utiliser la liste de capture pour la même chose et la propriété de fermeture de lambda se chargera du cycle de vie.
Voici un exemple de code
De loin, j'ai trouvé que les lambdas C ++ étaient le meilleur moyen de créer des threads, en particulier pour les fonctions de thread plus simples
la source
Cela dépend en grande partie de la bibliothèque que vous décidez d'utiliser. Par exemple, si vous utilisez la bibliothèque wxWidgets, la création d'un thread ressemblerait à ceci:
Si votre thread principal appelle la méthode CreateThread, vous allez créer un nouveau thread qui commencera à exécuter le code dans votre méthode "Entry". Vous devrez conserver une référence au thread dans la plupart des cas pour le rejoindre ou l'arrêter. Plus d'informations ici: documentation wxThread
la source