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 :

multi-threads : mutex et conditons


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut multi-threads : mutex et conditons
    Bonjour,
    je désire améliorer mon programme multi-threads en y ajoutant des mutex et des pthread_cond_signal ainsi que des pthread_cond_wait.

    Merci à Franck.H et Emmanuel Delahaye pour vos tutoriels que je trouve très bien faits (http://franckh.developpez.com/tutori...threads/#LIX-A et http://emmanuel-delahaye.developpez.com/pthreads.htm).

    Mais pour ma part, j'ai N+1 tâches : les N premières tâches doivent s'exécuter en simultané et la (N+1)ème tâche ne peut s'exécuter que si les N tâches ont fini leur exécution. Puis, lorsque c'est au tour de la (N+1)ème tâche de s'exécuter, les N premières doivent être en attente (les N premières tâches résolvent une équation différentielle sur [t, t+delta t] et la (N+1)ème tâche prend la solution finale (issue du calcul de l'équa diff) pour la "bidouiller" et renvoie les nouvelles conditions initiales au N premières tâches (je ne sais pas si j'ai été bien clair...)

    Donc, comment pourrais-je écrire la condition

    "tant que les N tâches sont en exécution ne rien faire" ou "tant que la tâche N+1 tourne, ne rien faire pour les autres".

    J'ai bien lu l'article de Franck.H dont son tutoriel est très similaire à mon problème en fait. Je suis presque sûr qu'il y a trois fois rien à modifier pour avoir ma solution.

    Avez-vous une idée ?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Bon, je pense avoir trouvé la solution à mon problème (mais pas testée encore). Dans l'articel de Franck.H, dans la fonction

    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
     
    /* Fonction pour les threads des clients. */
    static void * fn_clients (void * p_data)
    {
       int nb = (int) p_data;
     
       while (1)
       {
          int val = get_random (6);
     
     
          psleep (get_random (3));
     
          /* Debut de la zone protegee. */
          pthread_mutex_lock (& store.mutex_stock);
     
          if (val > store.stock)
          {
             pthread_cond_signal (& store.cond_stock);
             pthread_cond_wait (& store.cond_clients, & store.mutex_stock);
          }
     
          store.stock = store.stock - val;
          printf (
             "Client %d prend %d du stock, reste %d en stock !\n",
             nb, val, store.stock
          );
     
          pthread_mutex_unlock (& store.mutex_stock);
          /* Fin de la zone protegee. */
       }
     
       return NULL;
    }
    je pense que je n'ai qu'à supprimer la partie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (val > store.stock)
          {
             pthread_cond_signal (& store.cond_stock);
             pthread_cond_wait (& store.cond_clients, & store.mutex_stock);
          }
    pour avoir mes N premières tâches qui fonctionnent simultanément tout en ayant la tâche N+1 en attente (du fait du mutex...)

    ai-je raison ?

    PS : je n'ai pas de compilateur C pour tester mon idée...

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut
    Salut,

    Peut-être devrais tu regarder du côté des sémaphores, leur usage me parait adapté à ton problème.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Citation Envoyé par Montag Voir le message
    Salut,

    Peut-être devrais tu regarder du côté des sémaphores, leur usage me parait adapté à ton problème.
    ok, je vais voir ça demain au boulot.
    Merci

Discussions similaires

  1. Multi-thread, Mutex et performances
    Par buzzkaido dans le forum C++
    Réponses: 18
    Dernier message: 20/09/2010, 15h43
  2. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  3. [Multi-threading] Probleme avec les mutex
    Par homeostasie dans le forum Visual C++
    Réponses: 2
    Dernier message: 07/03/2007, 10h00
  4. [VB6][active x] faire du multi-thread avec vb
    Par pecheur dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 20/05/2003, 12h01
  5. [Kylix] exception qtinft.dll et multi-threading
    Par leclaudio25 dans le forum EDI
    Réponses: 3
    Dernier message: 27/03/2003, 18h09

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