Qu'est-ce exactement join() dans Boost::thread? (C++)
En Java, je ferais quelque chose comme:
Thread t = new MyThread();
t.start();
Je commence thread par l'appel de méthode start (). Plus tard, je peux faire quelque chose comme:
for (int i = 0; i < limit; ++i)
{
Thread t = new MyThread();
t.start();
}
De créer un groupe de threads et d'exécuter le code dans la méthode run ().
Toutefois, en C++, il n'y a pas une telle chose comme la méthode start (). Utilisation de Boost, si je veux un thread pour commencer à courir, j'ai appeler la méthode join() afin de faire un thread en cours d'exécution.
#include <iostream>
#include <boost/thread.hpp>
class Worker
{
public:
Worker()
{
//the thread is not-a-thread until we call start()
}
void start(int N)
{
m_Thread = boost::thread(&Worker::processQueue, this, N);
}
void join()
{
m_Thread.join();
}
void processQueue(unsigned N)
{
float ms = N * 1e3;
boost::posix_time::milliseconds workTime(ms);
std::cout << "Worker: started, will work for "
<< ms << "ms"
<< std::endl;
//We're busy, honest!
boost::this_thread::sleep(workTime);
std::cout << "Worker: completed" << std::endl;
}
private:
boost::thread m_Thread;
};
int main(int argc, char* argv[])
{
std::cout << "main: startup" << std::endl;
Worker worker, w2, w3, w5;
worker.start(3);
w2.start(3);
w3.start(3);
w5.start(3);
worker.join();
w2.join();
w3.join();
w5.join();
for (int i = 0; i < 100; ++i)
{
Worker w;
w.start(3);
w.join();
}
//std::cout << "main: waiting for thread" << std::endl;
std::cout << "main: done" << std::endl;
return 0;
}
Sur le code ci-dessus, la boucle for pour créer des threads 100, normalement je dois utiliser un boost::thread_group pour ajouter la fonction de thread, et enfin exécuter tous avec join_all(). Cependant, je ne sais pas comment le faire avec la fonction de thread mettre dans une classe qui utilise les différents membres de la classe.
D'autre part, la boucle ci-dessus ne se comportera pas comme la boucle en Java. Il fera de chaque thread à exécuter séquentiellement, pas tous à la fois comme les autres threads séparés, dont le propre join() est appelée.
Qu'est-ce que join() dans Boost exactement? Aussi s'il vous plaît m'aider à créer un groupe de threads qui partagent la même classe.
OriginalL'auteur Amumu | 2011-06-05
Vous devez vous connecter pour publier un commentaire.
join
n'est pas le début du thread, il vous bloque jusqu'à ce que le thread que vous êtes de rejoindre les finitions. Vous l'utilisez lorsque vous avez besoin d'attendre pour le fil que vous avez commencé à terminer son exécution (par exemple, si on calcule quelque chose et vous devez le résultat).Ce qui démarre le thread est
boost::thread
, qui crée le fil et les appels de la fonction de thread que vous avez passé (dans votre casWorker::processQueue
).La raison vous avez eu un problème avec la boucle n'est pas parce que le fils n'a pas pu démarrer, mais parce que votre thread principal ne pas attendre pour eux à exécuter avant la fin.
je devine que vous ne voyez pas ce problème en Java à cause de la tenue des différences, aka "un comportement non défini".après la modification En Java, le filetage se comporte légèrement différemment, voir le commentaire ci-dessous pour plus de détails. Ce qui explique pourquoi vous ne le voyez pas dans Java.Voici une question à propos de la
boost::thread_group
. Lire le code en question et les réponses, il vous aidera.Ok, merci, bon à savoir. Je ne suis pas un programmeur Java, donc je ne suis pas au courant des détails.
Merci. C'est très utile.
OriginalL'auteur littleadv
De rejoindre un thread fait la même chose en Boost comme il le fait en Java: il attend que le thread pour terminer l'exécution.
Plus, si je me souviens bien, de Stimuler les threads de s'exécuter lors de la construction. Vous ne commencez pas explicitement.
OriginalL'auteur Chris Jester-Young