Précédent   Forum du club des développeurs et IT Pro > C et C++ > C++ > Threads & Processus
Threads & Processus Forum d'entraide sur le multithreading et la programmation parallèle en C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 27/02/2013, 18h29   #1
sone47
Membre régulier
 
Inscription : novembre 2006
Messages : 349
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 349
Points : 79
Points : 79
Par défaut Attente d'un thread parmis plusieurs

Bonjour,

J'ai actuellement un main thread qui a besoin de lancer X threads secondaires.
Je voudrais pouvoir fixer Y, nombre de threads pouvant tourner en parallèle.
Des que 1 thread est terminé, le main relance un nouveau jusqu'a avoir lancé ces X threads.

Actuellement tout est lancé d'un trait puis on boucle sur tout les threads en faisant un join, ce qui fait que mon attente depend du premier thread lancé..
Et donc si le dernier est le plus rapide, je ne le vois pas.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
// Lancement
for(int i=0; i<nb_thread_a_lancer; i++)
{
    monThread[i].run(); // Lancement du thread i
}
 
// Attente des threads
for(int i=0; i<nb_thread_a_lancer; i++)
{
    monThread[i].wait(); // Encapsule un join
}
J'aimerais mettre en place un genre de select sur les threads lancé,
Je pensais a 2 solutions:

1/ Mettre en place un semaphore a Y etats (je ne sais pas si on dit comme ça), etant habitué des mutex (donc a 2 etats), je ne vois pas trop le principe avec un semaphore a Y etats:
Je définis dans mon main thread ce semaphore a Y etats, chaque thread lancé tente un wait sur le semaphore (son compteur interne est decrementé), une fois que les Y threads tournent le Y+1 n'est pas autorisé et donc attend le post d'un thread tournant. Est ce ça ?


2/ Utiliser un principe de fifo de message, mon main thread donne cette fifo a chaque thread lancé, une fois qu'un thread se termine il poste un msg dedans capté par le main qui lance un nouveau thread etc. Sauf que du coup j'aurais une boucle active dans mon main pour capter un message reçu.

3/ ??

Qu'est qui est fait en général ?
Avec une utilisation de la lib standard (mais pas c++11) et boost.

Merci d'avance
sone47 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2013, 09h30   #2
Iradrille
Membre éprouvé
 
Homme
Étudiant
Inscription : juin 2012
Messages : 266
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2012
Messages : 266
Points : 447
Points : 447
Tu peux utiliser un threadpool, voir ici par exemple. (la version C++11 de ce même code possède quelques explications supplémentaires, ici)

En gros, x threads de lancés et qui restent en attente tant qu'il n'y a rien à exécuter.

Et les threads se servent dans une liste de taches à exécuter.

Ça à l'avantage d'économiser le coût de construction / destruction des threads (non négligeable pour des taches très courtes).
Iradrille est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/03/2013, 10h47   #3
sone47
Membre régulier
 
Inscription : novembre 2006
Messages : 349
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 349
Points : 79
Points : 79
Merci,

Exact ça peut etre pas mal car la je me suis codé un manageur de thread avec un sémaphore avant le lancement de la tache, libéré a la fin de celle ci.
Mais effectivement du coup création de thread à chaque coup.
Les taches ne sont pas courtes mais il y en une quantité non négligeable.
sone47 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 15h02.


 
 
 
 
Partenaires

Hébergement Web