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

Comment limiter le nombre de threads simultanés [boost::thread] - C++ - Programmation

Marsh Posté le 16-04-2007 à 10:17:46    

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?

Reply

Marsh Posté le 16-04-2007 à 10:17:46   

Reply

Marsh Posté le 16-04-2007 à 11:11:52    

bah code une classe sémaphore d'abord.

Reply

Marsh Posté le 16-04-2007 à 11:33:11    

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

Reply

Marsh Posté le 16-04-2007 à 12:19:30    

avec une Condition, c'est trivial

Reply

Marsh Posté le 16-04-2007 à 13:29:29    

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

Reply

Marsh Posté le 16-04-2007 à 13:35:03    

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
Reply

Marsh Posté le 16-04-2007 à 13:52:06    

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.

Reply

Marsh Posté le 16-04-2007 à 14:33:04    

montre donc ton code alors ?

Reply

Marsh Posté le 17-04-2007 à 09:42:58    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed