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 :

Mutex et condition


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 23
    Points : 6
    Points
    6
    Par défaut Mutex et condition
    Bonsoir,

    J'ai un peu de mal à comprendre comment utiliser les mutexs et conditions.
    Quelques questions :
    -Faut-il déclarer un mutex par variable globale partagée?
    -Peut-on utiliser les mutexs et conditions autre part que dans un thread?

    Si quelqu'un peut m'orienter vers des exemples où 2 threads modifie une variable globale "en même temps" pour que je saisisse comment ça marche, à par les pages du man, j'ai rien trouvé qui m'éclaire.

    Merci d'avance

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Regarde la section Arrays

    http://www.cs.cf.ac.uk/Dave/C/node32.html

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Mutex et condition
    Citation Envoyé par Vodlich
    Si quelqu'un peut m'orienter vers des exemples où 2 threads modifie une variable globale "en même temps" pour que je saisisse comment ça marche, à par les pages du man, j'ai rien trouvé qui m'éclaire.
    http://emmanuel-delahaye.developpez.com/pthreads.htm
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 23
    Points : 6
    Points
    6
    Par défaut Re: Mutex et condition
    Merci pour ces liens. Je vais étudier tout cela.

  5. #5
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 23
    Points : 6
    Points
    6
    Par défaut Re: Mutex et condition
    Une question, est-ce qu'un pthread_cond_wait(&condition, &mutex) attend forcement un pthread_cond_signal(&condition) (ou autre de la même famille) pour passer à la suite ou bien si le mutex est deverouillé, il n'attend pas et passe directement à la suite ?

    Et encore la même question, faut-il un couple mutex condition pour chaque variable partagée ou bien un seul pour toutes les variables partagées ?

    Merci d'avance.

  6. #6
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    De la page manuel de pthread_cond_wait:

    pthread_cond_wait déverrouille atomiquement le mutex
    (comme pthread_unlock_mutex) et attend que la variable
    condition cond soit signalée. L'exécution du thread est
    suspendu et ne consomme pas de temps CPU jusqu'à ce que la
    variable condition soit signalée. Le mutex doit être ver*
    rouillé par le thread appelant à l'entrée de
    pthread_cond_wait. Avant de rendre la main au thread
    appelant, pthread_cond_wait reverrouille mutex (comme
    pthread_lock_mutex).

    Déverrouiller le mutex et suspendre l'exécution sur la
    variable condition est effectué atomiquement. Donc, si
    tous les threads verrouillent le mutex avant de signaler
    la condition, il est garanti que la condition ne peut être
    signalée (et donc ignorée) entre le moment où un thread
    verrouille le mutex et le moment où il attend sur la vari*
    able condition.
    Donc il faut que le mutex soit verouille (que le thread qui lance le pthread_cond_wait ait possession du mutex) pour que l'appel fonctionne. Et en lisant les pages manuels, ils disent que c'est avec l'appel pthread_cond_signal que les threads se reveillent par la suite... Le fait que le mutex se libere n'importe pas puisque de toute facon, pthread_cond_wait libere lui-meme le mutex en question...


    Et encore la même question, faut-il un couple mutex condition pour chaque variable partagée ou bien un seul pour toutes les variables partagées ?
    Cela depend du programme. Imagine que j'ai un tableau et que je sais que les lectures/ecritures se font soit sur les elements d'indice pair, soit les elements d'indices impairs.

    J'ai deux solutions:

    - Avoir un mutex pour tout le tableau
    - Avoir deux mutex: un pour les pairs et un autre pour les impairs...

    Donc pour repondre a ta question, cela depend de si tu arrives/peux diviser les ressources. Un autre probleme, si tu divises trop tes ressources et necessitent donc beaucoup de mutex, tes threads ne vont pas arretes d'etre en attente pour une ressource, puis une autre, puis une autre... Ne parlons meme pas du risque d'interblocage...

  7. #7
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Attention tout de même : si un pthread_cond_signal est émis et qu'aucun thread n'est en mesure de le recevoir (ie sur un pthread_cond_wait), alors ce signal est perdu. Et si par la suite un thread se met en attente de ce même signal, il risque d'attendre longtemps...
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  8. #8
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 23
    Points : 6
    Points
    6
    Par défaut Re: Mutex et condition
    Si j'ai bien compris, lors d'une lecture ou écriture de ma variable partagée, je fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    pthread_mutex_lock(&verrou);
    pthread_cond_wait(&condition, &verrou);
     
    /* lecture ou ecriture de la variable partagée */
     
    pthread_mutex_unlock(&verrou);
    pthread_cond_signal(&condition);
    Et donc le thread exécutant ce code sera en attente jusqu'à ce qu'il y ait un pthread_cond_signal(&condition) ailleurs.

    c'est bien cela?

  9. #9
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    c'est bien cela?
    Non, pour un mutex, c'est simplement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    pthread_mutex_lock(&verrou);
     
    /* lecture ou ecriture de la variable partagée */
     
    pthread_mutex_unlock(&verrou);
    pthread_cond_wait s'utilise dans le cas où on attends une condition particulière... Regarde l'exemple de la page manuel:

    http://www.linux-kheops.com/doc/man/...ait.3.txt.html

  10. #10
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 23
    Points : 6
    Points
    6
    Par défaut
    Merci pour votre aide.
    Je pense avoir saisi le principe. En fait, je n'ai pas besoin de condition dans mon cas (vu que j'ai des threads qui modifient de manière continu mes variables partagées sans attendre quoi que ce soit des autres threads).
    Je vais appliquer cela et je vous tiens au courant.

  11. #11
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 23
    Points : 6
    Points
    6
    Par défaut
    Après application, tout marche pour le mieux
    Merci à vous tous pour votre précieuse aide.

Discussions similaires

  1. Pthreads: Conditions et Mutex
    Par Arkenis dans le forum Débuter
    Réponses: 19
    Dernier message: 28/01/2015, 19h05
  2. Aide threads, mutex et variables de conditions
    Par paladice dans le forum C
    Réponses: 1
    Dernier message: 25/04/2011, 00h27
  3. mutex, condition dans un module kernel
    Par Vowyo dans le forum C
    Réponses: 2
    Dernier message: 15/06/2010, 08h43
  4. problème de mutex et de condition
    Par mitmat dans le forum SDL
    Réponses: 4
    Dernier message: 03/04/2008, 17h25
  5. Réponses: 7
    Dernier message: 27/08/2007, 08h28

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