2010-08-11 4 views
1

boost :: classe thread a un constructeur par défaut qui donne une "Not-a-fil", alors quel estboost :: enfile et crée un pool d'entre eux!

boost::thread t1;

bon? Puis-je lui donner une fonction à exécuter plus tard dans le code?

et une autre question:

J'essaie d'écrire un petit serveur qui a une architecture mise en scène (SEDA), il y a un certain nombre de threads de travail à chaque étape et les étapes sont connectées avec des files d'attente d'événements. lorsque je crée le pool avec 4 threads de travail en utilisant boost :: thread_group comme ceci: (J'ai supprimé la variable de condition dans la file d'attente pour la nettoyer ici, et en supposant que la taille de la file est toujours 4N)

boost::thread_group threads; 
while(!event_queue.empty()) 
{ 
    for(int i = 0; i < 4; ++i) 
    { 
     threads.create_thread(event_queue.front()); 
     event_queue.pop(); 
    } 

    threads.join_all(); 
} 

le thread_group ne cesse de croître en taille. qu'arrive-t-il aux threads du groupe qui ont fini et comment puis-je réutiliser ces threads et garder la taille de thread_group à 4?

j'ai vu this question et au lieu du code ci-dessus utilisé ceci:

std::vector<boost::shared_ptr<boost::thread>> threads; 
while(!event_queue.empty()) 
{ 
    for(int i = 0; i < 4; ++i) 
    { 
     boost::shared_ptr<boost::thread> 
      thread(new boost::thread(event_queue.front()); 
     event_queue.pop(); 
     threads.push_back(thread); 
    } 

    for(int i = 0; i < 4; ++i) 
     threads[i]->join(); 

    threads.clear(); 
} 

Quelle est donc la différence et que l'on a une meilleure performance? Y aura-t-il une fuite de mémoire? ou existe-t-il une autre façon de créer un simple pool de threads?

J'apprécierais toute aide. Merci beaucoup.

Répondre

2

Une des options est d'utiliser boost asio. Jetez un oeil à la recette pour un pool de threads: http://think-async.com/Asio/Recipes. Vous publiez ensuite des événements dans le pool de threads à l'aide de la méthode post de io_service.

Questions connexes