IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

[C++] Problème avec les Threads


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 30
    Par défaut [C++] Problème avec les Threads
    Bonjour à tous,

    J'ai un petit problème quant à l'utilisation des threads. Mon code de base et de ce type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    void ObjetPrincipal::maFonction()
    {
        for(int i=0; i<10; i++)
        {
            tableauObjets[i]->maMethode(); //On a :  vector< Objet* > tableauObjets;
        }
    }
     
    void ObjetPrincipal::bouclePrincipal()
    {
        for(int k=0;k<5000;k++)
        {
    	//....
     
    	maFonction();
     
    	//...
        }
     
    }
    Ce que je souhaiterais c'est avoir un thread par tableauObjets[i] pour exécuter maMethode(). J'arrive à réaliser cela grâce à ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    void* start_thread(void* arg) 
    {
         static_cast<Objet*>(arg)->maMethode();
         pthread_exit(NULL);
    }
     
    void ObjetPrincipal::maFonction()
    {
         int i;
         pthread_t thread[10];
     
         for(i = 0 ; i < 10 ; i++)
    	  pthread_create (&thread[i], NULL, start_thread, tableauObjets[i]);
     
         for(i = 0 ; i < 10 ; i++)
              pthread_join (thread[i], NULL);
     
    }
     
    void ObjetPrincipal::bouclePrincipal()
    {
        for(int k=0;k<5000;k++)
        {
    	//....
     
            maFonction();
     
    	//...
        }
    Ce code marche mais est plus long que si je n’utilisais pas de threads (j'ai un processeur double coeur). Je pense que cela est dû au fait que je recréé de nouveau threads à chaque fois. J'ai essayé de les réutiliser mais je n'y arrive pas, comment faut-il faire?

    Merci d'avance pour votre aide.

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Je ne suis pas un grand spécialiste des threads mais le problème semble venir de l'attente de fin pour chaque thread. Donc dans la deuxième boucle.

    Si tu es forcé de t'assurer que le traitement du tableau est complet avant de poursuivre, peut être que tu peux utiliser une variable partagée que chaque thread incrémente. Il te suffit alors de faire une boucle d'attente dans laquelle tu compares cette variable avec le nombre d'élément du tableau. Une fois les deux valeurs identiques, tu sors de la boucle pour poursuivre.

    Cette méthode permet à tous les threads de s’exécuter sans attente. En contre partie on a tout de même une boucle d'attente générale. Et qui est bloquante de surcroît. A toi de voir...

  3. #3
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 30
    Par défaut
    Je ne comprend pas du tout ce qui ce passe. J'ai essayer avec un seul Thread. Voila mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    pthread_cond_t condition= PTHREAD_COND_INITIALIZER;
    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
    int compteur=0;
     
    void* start_thread(void* arg) 
    {
        while(1)
        {
            pthread_mutex_lock(&mutex); 
    	pthread_cond_wait (&condition, &mutex); 
    	pthread_mutex_unlock(&mutex);
     
            static_cast<Objet*>(arg)->maMethode();
            compteur++;
        }
        pthread_exit(NULL);
    }
     
    void ObjetPrincipal::bouclePrincipal()
    {
        pthread_create(&monThread, NULL, start_thread, tableauObjets[0]);
     
        for(int k=0;k<5000;k++)
        {
    	//....
     
            pthread_mutex_lock (&mutex);
    	pthread_cond_signal (&condition);
    	pthread_mutex_unlock (&mutex);
     
    	while(compteur!=1){}
    	compteur=0;
     
    	//...
        }
        pthread_join (monThread, NULL);
    }
    Mais cela ne marche pas.

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Tu modifies "compteur" dans le thread alors qu'en même temps tu compares sa valeur dans le main. "compteur" doit être inclus dans le mutex.
    Ensuite comment sors-tu de la boucle while(1)?

  5. #5
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 30
    Par défaut
    Merci, avec le mutex sa marche. Bon par contre, le code est plus lent que précédemment, je crois que je vais donc abandonner le multi-threading.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec les thread
    Par _SamSoft_ dans le forum Réseau
    Réponses: 21
    Dernier message: 28/10/2007, 15h21
  2. problèmes avec les threads
    Par lukbutor dans le forum C
    Réponses: 7
    Dernier message: 03/05/2007, 00h15
  3. Problèmes avec les thread et les pointeurs
    Par raspac dans le forum POSIX
    Réponses: 2
    Dernier message: 22/10/2006, 17h35
  4. [BOOST] Problème avec les threads
    Par SOAD08 dans le forum Dev-C++
    Réponses: 7
    Dernier message: 08/10/2006, 10h23
  5. Réponses: 5
    Dernier message: 10/05/2005, 10h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo