Voilà j'ai un programme multithreading qui a pour but d'effectuer plusieurs traitements sur plusieurs répertoires via des threads :
Chaque thread ne parcours qu'un répertoire et effectue les traitements.
Mon souci vient de la ressources:
class TraitementsSurRepertoire{ void operator()() { lancementTraitements();} void lancementTraitements(){.....} TraitementsSurRepertoire(std::string nomRep); };
std::vector<std::string> listeDesRepertoire; //... boost::thread_group grp2Thread; for(std::vector<std::string>::iterator it = listeDesRepertoires.begin(); it !=listeDesRepertoires.end(); ++it) { TraitementsSurRepertoire traitementPr1Rep(*it); grp2Thread.create_thread( boost::ref(traitementPr1Rep) ); } grp2Thread.join();
Cela ne fonctionne pas puisque les différentes instances sur TraitementsSurRepertoire sont "perdu" à chaque parcours de la boucle.
J'aimerai traiter ce bout de code de manière PROPRE sachant que je ne connais pas avant l'exécution du programme le nombre de répertoire à parcourir, la liste étant renseignée via un fichier de configuration.
J'ai essayé de stocker les instances dans un std::vector avant de créer un thread mais cela ne fonctionne pas (pour les même raisons sans doute).
Je pense que je n'utilise pas du tout la bonne approche mais... je suis trop têtu...
Edit (mais je sens que mes neurones sont à plat) : devrais-je garder la copie que fait boost en créant le thread? Copie évitée via l'instruction boost::ref() ?
Ben qu'est-ce qui t'empêche d'instancier TraitementsSurRepertoire avant la boucle et de passer *it en paramètre au thread avec boost::bind ?
Je mettrais ma main à couper que ça a été expliqué dans un article de Programmez! ça. Tu as forcément du le voir. (Paragraphe 4: Une routine de thread recevant des arguments)
Qu'est-ce qu'il était bon cet article. Il y avait vraiment tout ce qu'il faut dedans ;) :lol:
Ah j'ai oublié de faire référence au N°96 de Programmez :lol:
Oui il est très bien cette article et je dis pas ça a cause de l'auteur, mais c'est qu'il est très efficace :)
Le souci avec ta solution proposé c'est que je l'avais testé...
Là ou j'ai "loupé mon coup" c'est en n'utilisant pas la bonne méthode surchargé de boost::bind()
Donc j'avais une erreur de compilation;
J'ai chercher correctement, hier, et j'utilise boost::bind() de cette manière :
boost::bind(Traitement::lancementTraitements, boost::ref(traitementPr1Rep),*it)
Et là ça fonctionne !
(au passage ma toute dernière remarque à propos de ne pas utiliser boost::ref dans ma boucle ça "fonctionne"... Mais c'est pas terrible comme manière de faire...