Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3005 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [boost::thread] Comment limiter le nombre de threads simultanés

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[boost::thread] Comment limiter le nombre de threads simultanés

n°1543209
papangue
Posté le 16-04-2007 à 10:17:46  profilanswer
 

Salut,
Je continue dans ma découverte de la programmation multithread...
Mais je bloque à une endroit:
les sémaphores n'existant pas dans la bibliothèque boost::thread (voir le lien http://www-eleves-isia.cma.fr/docu [...] question10)
Je n'arrive pas a voir comment compenser ce manque.
En effet mon objectif est de limiter le nombre de threads aux nombre de CPU présents. Avec un semaphore il me semble qu'il n'y aurait pas de soucis, sans j'ai du mal à voir comment implémenter cette limitation.
 
Quelqu'un aurait-il l'info?
 
Merci?

mood
Publicité
Posté le 16-04-2007 à 10:17:46  profilanswer
 

n°1543228
Taz
bisounours-codeur
Posté le 16-04-2007 à 11:11:52  profilanswer
 

bah code une classe sémaphore d'abord.

n°1543241
papangue
Posté le 16-04-2007 à 11:33:11  profilanswer
 

C'est pour ca que je demande un petit coup de main.. parce que je ne vois pas par ou commencer.

n°1543277
Taz
bisounours-codeur
Posté le 16-04-2007 à 12:19:30  profilanswer
 

avec une Condition, c'est trivial

n°1543306
papangue
Posté le 16-04-2007 à 13:29:29  profilanswer
 

pas vraiment mais bon... peut etre suis-je une quiche?!

n°1543309
nico168
Posté le 16-04-2007 à 13:35:03  profilanswer
 

genre le semaphare sem (int) est initialisé a 2.
quand tu lances un thread, tu decrementes sem, si sem > 0, tu retourne vrai sinon false.
quand un thread s'arrete, tu incrementes sem.

 

tout les acces a sem doit etre dans une section critique.

 

Je sais pas si c'est la bonne facon de faire.


Message édité par nico168 le 16-04-2007 à 13:41:48
n°1543313
papangue
Posté le 16-04-2007 à 13:52:06  profilanswer
 

merci - C'est bon j'ai enfin réussit...
Il faut utiliser la class boost::condition comme Taz l'a dit. Après tout l'astuce se trouve dans la manière de gérer son mutex...
 
Taz => malheureusement je ne trouve pas cela si trivial que cela.
 
nico168 => ça revient grosso modo à ça.

n°1543331
Taz
bisounours-codeur
Posté le 16-04-2007 à 14:33:04  profilanswer
 

montre donc ton code alors ?

n°1543615
papangue
Posté le 17-04-2007 à 09:42:58  profilanswer
 

Taz a écrit :

montre donc ton code alors ?


 
Ci joint un code simplifié:
pour le point h:

Code :
  1. class base_thread
  2. {
  3. public:
  4.      void operator() ();
  5.      virtual void launch() = 0;
  6. private:
  7.      static int NB_max_thread;
  8.      static int NB_launched_thread;
  9.      static boost::mutex block_thread;
  10.      static boost::condition not_enough_thread;
  11. }


 
pour le point cpp:

Code :
  1. int base_thread::NB_max_thread = 2;
  2. int base_thread::NB_launched_thread = 0;
  3. boost::mutex base_thread::block_thread;
  4. boost::condition base_thread::not_enough_thread;
  5. void base_thread::operator() ()
  6. {
  7.         { // ATTENTION CES ACCOLADES SONT IMPORTANTES POUR DEFINIT LE SCOPE DU LOCK
  8.                 boost::mutex::scoped_lock lock(block_thread);
  9.                 while(NB_launched_thread==NB_max_thread)
  10.                       not_enough_thread.wait(lock);
  11.         }
  12.         NB_launched_thread++;
  13.         launch();
  14.         NB_launched_thread--;
  15.         not_enough_thread.notify_one();
  16. }


 
Il ne reste plus qu'à dériver pour chaque thread une classe de base_thread, de surcharger la fonction launch et ensuite de lancer le thread avec la méthode standard de boost.
Tous les threads se retrouvent en wait dans le while grace au boost::condition (dans le while) sauf les NB_max_thread premiers.
ET quand un thread est fini il relache le suivant grace à la méthode boost::condition::notify_one().
 
Bref c'est pas si évident que ça.
 
Je n'ai pas programmé un semaphore car je n'en ai pas l'utilité mais libre a vous de vous inspirer du code.
Si vous voyer un soucis dans l'algorithme merci de me le dire.... pour la qualité du code, désolé c'est juste ici un code simplifié réécrit de tête... enfin je ne sais même pas si ca compile comme ca car comme je vous ai dit c'est juste ici un code simplifié réécrit de tête.
Mon code complet lui fonctionne très bien.


Message édité par papangue le 17-04-2007 à 09:55:36

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [boost::thread] Comment limiter le nombre de threads simultanés

 

Sujets relatifs
intérêt de boost::multi_array ?[résolu][boost::thread] thread à partir d'une fonction à argument?
Gestion de la navigation par jour avec nombre d'affichage limité svpappel des threads dans une boucle while
Problème de thread avec les sockets en .NETAméliorer la vitesse du fonction donnant un nombre aléatoire
comment augmenter le nombre de jointure sur mysql??nombre max d'image par ligne
[VBSCRIPT] nombre ? 
Plus de sujets relatifs à : [boost::thread] Comment limiter le nombre de threads simultanés


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR