2010-10-11 6 views
2

j'ai une file d'attente d'urls et i un traitement avec une fonction i besoin d'exécuter un fil 10 à lire le site web 10 en même temps ,,,créer Dynamiquement fil dans C++

boost::thread tl(boost::bind(&thread::start, crawl, url)); 

nous pouvons utiliser pour boucle mais est-ce est la seule façon d'utiliser pour créer fil dynamique ....

Edité

while(!q.empty()) 
        { 


         boost::thread_group Tg; 
         for(int k=0;k<=1;k++) 
         { 

         Tg.create_thread(boost::bind(&threadMaster::start, mastercrawl, q.front())); 
         Tg.join_all(); 

         } 
        } 

cela fonctionne comme seul fil et

Tg.create_thread(boost::bind(&threadMaster::start, mastercrawl, "http://www.google.co.in")); 
           Tg.create_thread(boost::bind(&threadMaster::start, mastercrawl, "http://www.yahoo.com")); 

cela fonctionne comme multi thread comment puis-je faire fonctionner mon premier programme multithread

Répondre

1

vous pourriez envisager OpenMP si votre compilateur supporte (par exemple Visual C++ fait). Vous ne devez pas créer de threads par vous-même, mais plutôt

#include <omp.h> 
omp_set_num_threads(10); 
#pragma omp parallel 
{ 
    #pragma omp for 
    for (int i=0;i < queueLength; i++) 
    { 
     //load url[i] 
    } 
} 
+0

ya hai OMP est grand et j'ai essayé cet exemple #include '#include int main() { #pragma omp parallèle printf (" Bonjour de fil% d, nthreads% d \ n ", omp_get_thread_num(), omp_get_num_threads()); } ' il est dit' référence non définie à 'omp_get_thread_num'' – raja

+0

j'utilise gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) – raja

+0

@raja: Voir si' libgomp.so' est dans '/ usr/lib /' . Ou, continuez à utiliser Boost et ne vous inquiétez pas de telles choses. – Potatoswatter

1

Sans C++ 0x, vous ne pouvez pas mettre un thread dans un récipient tel que vector, vous finirez probablement créer une sorte de boucle.

Vous pouvez cependant créer un tableau de thread et le remplir. Les astuces habituelles pour "éliminer" une boucle s'appliquent.

{ 
    boost::thread threads[10]; // or *threads = new thread[10]; 
    std::fill_n(threads, 10, boost::bind(&thread::start, crawl, url)); 
} // destroy array: destructors wait for threads to finish. 
+0

je reçois un problème maintenant le deuxième thread attend jusqu'à ce que le premier thread se termine – raja

+0

@raja: Si tous consomment la même file d'attente de travail, ils devraient tous finir à à peu près en même temps. Je ne peux pas donner de conseil plus spécifique sans voir plus de code. – Potatoswatter

+0

la file d'attente a maintenant 2 données – raja

0

[ThreadGroup exemple] "cela fonctionne comme seul thread".

De ce que nous voyons, il ne devrait pas. Cependant, si vous avez partagé un mutex très disputé entre ces threads, vous verrez que seul le thread contenant le mutex fonctionne. Cela expliquerait le comportement observé. En particulier, pour votre exemple, vous devriez pas tenir un mutex pendant que vous faites le HTTP GET réel dans le fil.

1
while(!q.empty()) 
{ 
    boost::thread_group Tg; 
    for(int k=0;k<=1;k++) 
    { 
    Tg.create_thread(boost::bind(&threadMaster::start, mastercrawl, q.front())); 
    } 
    Tg.join_all(); 
}