Comment limiter le nombre de threads simultanés [boost::thread] - C++ - Programmation
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.
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.
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.
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 :
|
pour le point cpp:
Code :
|
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.
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?