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

 C Discussion :

Threads définis de manière récursive et mutex


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 9
    Points : 9
    Points
    9
    Par défaut Threads définis de manière récursive et mutex
    Bonjour!

    Je travaille actuellement sur un projet : la simulation d'un bus CAN, en C. Pour ce faire, j'utilise des threads, qui sont coordonnés par des mutex (cf code). J'ai un problème pour coordonner 10 threads avec les données calculées dans un autre thread. Voici ce que j'ai fais (c'est juste une petite partie du programme, le reste n'a rien à voir avec ce problème, je ne met pas le main() non plus, ni les initialisations).

    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
     
       pthread_cond_t var = PTHREAD_COND_INITIALIZER;
       pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
     
    for(i=0;i<10;i++)
    { 
        k=i;
        if(pthread_equal(id,tid[i]))     //création de 10 threads 
        {
            //je fais des choses, les 10 threads font leurs calculs, une fois que ces calculs sont faits ils autorisent la création du thread n°13 (cf dessous)
     
          while(1)
           {
                   pthread_mutex_lock(&mutex); 
            pthread_cond_wait (&var, &mutex); 
            pthread_mutex_unlock(&mutex);
     
                   printf("\n je suis le node %d",k);
           }
        }
    }
    ces threads sont cencés se coordonner avec celui là :

    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
     
    if(pthread_equal(id,tid[13]))
    {
     
            while(1)
             {
                 usleep(1000);  
                 time_since_beginning=time_since_beginning+1; // temps en ms
     
                if(time_since_beginning%10==0)  //operateur modulo
                {
                                    printf("\nTIC");
                     pthread_mutex_lock (&mutex); 
                     pthread_cond_signal (&var); 
                     pthread_mutex_unlock (&mutex);
                 }
                  }
     
    }

    Mon problème est que je voudrais que le programme se comporte de cette façon : à chaque fois que la variable time_since_beginning%10 arrive à 0, le programme affiche

    TIC
    je suis le node 1
    je suis le node 2
    ...
    je suis le node 8
    je suis le node 9
    TIC
    je suis le node 1
    je suis le node 2
    ...
    je suis le node 8
    je suis le node 9
    TIC
    etc... (l'ordre n'a pas d'importance tant qu'au final les 10 'je suis le node X' sont présents entre deux 'TIC')

    Mais ce qui se passe en réalité c'est que le programme affiche

    TIC
    je suis le node 5
    TIC
    je suis le node 1
    TIC
    je suis le node 8
    TIC
    ....



    Je soupçonne très fortement que le problème est que seul un thread sur les 10 reçoit le signal 'var' qui permet de faire un tour de boucle. Ma question est donc la suivante : existe t-il un moyen pour que les 10 threads, et pas seulement 1, reçoivent le signal, et fassent ainsi tous un tour de boucle?


    Merci d'avance

  2. #2
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 62
    Points : 162
    Points
    162
    Par défaut
    Bonjour,
    En effet, tu as raison, un seul thread reçoit le signal, ou plutôt, un seul l'utilise. pthread_cond_signal ne donne qu'un "jeton" à utiliser. Si tu veux que tous tes threads se réveillent il faut utiliser la fonction pthread_cond_broadcast.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    Merci beaucoup, ça marche désormais, je ne connaissais pas pthread_cond_broadcast!

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

Discussions similaires

  1. Objet Parameter défini de manière incorrecte.
    Par Débéa dans le forum Bases de données
    Réponses: 5
    Dernier message: 26/04/2013, 15h17
  2. [Tableaux] Construire un tableau de manière récursive
    Par eclipse012 dans le forum Langage
    Réponses: 26
    Dernier message: 23/01/2007, 15h59
  3. Chargement Treeview de manière récursive
    Par exclusif dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 23/01/2007, 13h42
  4. [XSLT] remplacement de noeuds de manière récursive
    Par daniel_r dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 24/10/2005, 20h13
  5. [Zip] Dézipper de manière récursive
    Par Sfeabg dans le forum Entrée/Sortie
    Réponses: 8
    Dernier message: 08/03/2005, 16h24

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