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

POSIX C Discussion :

Synchronisation avec sémaphore.


Sujet :

POSIX C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 1
    Par défaut Synchronisation avec sémaphore.
    Bonjour,

    J'aurais besoin d'un peu d'aide concernant les sémaphores.
    Je souhaiterais synchroniser trois processus ( P1, P2, P3 ).
    Chacun ayant une tache bien défini ( par exemple P1 crées des données, P2 les lit, P3 les enregistres ).
    J'ai fais pas mal de recherche sur internet, pour réussir à trouver ceci:

    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
    (sem)
      début
        k = k -1;
        si k < 0 alors
          mettre le processus appelant dans la liste L;
          endormir le processus appelant;
        finsi
      fin
    Déblocage du processus
     
    v(sem)
      début
        k = k + 1;
        si k <= 0 alors
          sortir un processus de la liste d''attente
          réveiller le processus
        fin si
      fin
    voila cela dit je ne comprend pas le fonctionnement exact.
    D'autant plus que je ne comprend pas pourquoi aucune instruction n'est mise dans ce code. Je fais peut être fausse route ( Surement même ^^ ) enfin voila j'aimerais un peu d'aide si possible ca fais trop longtemps que je galère pour au final tourner en rond, ma question est donc commment synchroniser trois processus ?
    Merci d'avance.

  2. #2
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 23
    Par défaut
    Salut,

    Tout d'abord tu veux programmer ça sous quel os ?

    Sous linux tu as plusieurs manières de synchroniser les pus :
    ->signaux
    ->tubes
    ->ipc system (semaphores...)

    les threads permettent d'utiliser des mutex (semaphore d'exclusion mutuelle) si tu sais ce qu'est un thread (pus leger...)

    Le code que tu as indiqué ci dessus indique comment sont implémentés les opérations prendre et vendre des sémaphores. La variable k indique le nombre de fois que le semaphore peut être pris (operation prendre). Prenons l'exemple de deux pus que nous voulons synchroniser nous prenons donc deux semaphores S1 et S2 avec k=0


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     P1                     P2 
      |                      |
      |                      |
     P(S1)                V(S1)
     V(S2)                P(S2)  
      |                      |
      |                      |
    Ou un autre exemple si tu veux que P2 commence une fois que P1 est terminé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     P1                     P2
      |                   P(S1)
      |                      |
      |                      |
      |                      |
      |                      |
    V(S1)                    |
    Déroule ton pseudo code tu devrais comprendre.

  3. #3
    Membre très actif Avatar de tim974
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 175
    Par défaut
    En gros quand tu fais un P() sur un sémaphore cela le décrémente et s'il est à 0, il met tout les autres en file d'attente en sleep.
    D'où l'intérêt de mettre la sémaphore à 1 si tu veux qu'un unique processus y accède.
    Quand tu fais un V() sur le sémaphore cela l'incrémente et il réveille le prochain sur la file d'attente!
    Le principe est simple, le code l'est moins

  4. #4
    Membre averti
    Inscrit en
    Décembre 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 37
    Par défaut
    le plus simple serait peu-être d'utiliser une message queue (msget, msgrcv, msgsnd) et de mettre les processes en attente d'un type particulier de message :

    exemple:
    P1 fait ce qu'il a faire et envoie un message de type 12
    P2 attend les messages de type 12 , fait ce qu'il a faire quand il recoit un tel message et envoie un message de type 23 une fois le traitement fini
    P3 attend les messages de 23 et fait ce qu'il a faire quand il recoit un tel message

Discussions similaires

  1. Synchronisation avec Sémaphore
    Par khalil.ajmi dans le forum Embarqué
    Réponses: 3
    Dernier message: 16/12/2013, 13h59
  2. Synchronisation Avec LDAP
    Par Patrick31 dans le forum Access
    Réponses: 1
    Dernier message: 24/10/2006, 18h04
  3. [SQL2K] : Synchronisation avec d'autres bases de données
    Par zalalus dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 21/07/2006, 17h07
  4. Thread Synchronisation avec structure FIFO ??
    Par vincedom dans le forum MFC
    Réponses: 5
    Dernier message: 30/03/2006, 06h00
  5. [VB.NET] DataGridView et synchronisation avec une BD
    Par tidan dans le forum Windows Forms
    Réponses: 3
    Dernier message: 02/02/2006, 11h12

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