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 :

pthread_cond_wait et pthread_cond_signal


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 116
    Par défaut pthread_cond_wait et pthread_cond_signal
    Voila j'ai eu besoin qu'a un certain moment un thread soit bloquant jusqu'a ce qu'un autre me dise de y aller.
    J'ai donc utilisé les fonctions pthread_cond_wait et pthread_cond_signal.
    Trouvant les man de ces fonctions un peu flous je suis allés me promener sur la toile et suis tombé sur un exemple de code sur le site yolinux, le code ressemblant un peu a cela :

    dans le thread bloquant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    pthread_mutex_lock( &condition_mutex );
    pthread_cond_wait( &condition_cond, &condition_mutex );
    pthread_mutex_unlock( &condition_mutex );
    et dans le thread qui signal que l'autre peux executer ces actions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    pthread_mutex_lock( &condition_mutex );
    if(....)
    {
         pthread_cond_signal( &condition_cond );
    }
    pthread_mutex_unlock( &condition_mutex );
    J'ai mis a execution cet exemple ... et ca marche, c'est super.
    Par contre je n'ai pas compris l'utilisation du mutex_lock avant et apres le wait et le signal ... quelqu'un pourrait-il m'expliquer ce mécanisme ?

    Merci d'avance.

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Ca sert car il est souvent nécessaire que le code autour de pthread_cond_wait soit atomique.

    Si tu faisais quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    pthread_mutex_lock( &condition_mutex );
     //des calcules
     
     
    pthread_mutex_unlock( &condition_mutex );
     //----> probabilité non nul que les données deviennent incohérentes à ce moment
    pthread_cond_wait( &condition_cond);
    pthread_mutex_lock( &condition_mutex );
     // des calculs
    pthread_mutex_unlock( &condition_mutex );
    Même si a priori ça ne sert pas dans ton cas. Il est souvent nécessaire d'avoir un code atomique autour de l'endormissement et du réveil.

    Par exemple, supposons que tu disposes de deux threads. Et que tu t'endorment que si l'autre ne dorme pas. On note nbThreadDormant le nombre de thread qui dort.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //code faux
    if(nbThreadDormant == 0)
      nbThreadDormant++;
      S'endormir
    else
      Reveiller l'autre
    Il y a une probabilité qu'entre le if et S'endormir, l'autre thread s'endorme effectivement, c'est pour cela qu'il est nécessaire d'utiliser des mutex à ce niveau et d'être sûr que tout soit atomique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    pthread_mutex_lock( &condition_mutex );
    if(nbThreadDormant == 0) {
      nbThreadDormant++; 
      pthread_cond_wait( &condition_cond, &condition_mutex);
    }
    else {
      pthread_cond_broadcast(&condition_cond);
      nbThreadDormant = 0;
    }
    pthread_mutex_unlock( &condition_mutex );

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 116
    Par défaut
    merci beaucoup pour la réponse millie, maintenant j'y vois beaucoup plus clair.

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

Discussions similaires

  1. pthread_cond_wait & while
    Par 44Magnum dans le forum C
    Réponses: 1
    Dernier message: 26/01/2013, 00h06
  2. Réponses: 19
    Dernier message: 29/07/2008, 19h30

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