next up previous contents
suivant: Les philosophes mangeurs de monter: Les lecteurs/rédacteurs précédent: Une solution avec un   Table des matières

Une solution avec un moniteur

fichier : moniteur;
  var : ecrire : booleen;
        nbLecteurs : entier;
        cEcrire, cLire : condition;
procedure debutLire;                 | processus lecteur;
  debut                              |   debut
  nbLecteurs := nbLecteurs + 1;      |   fichier.debutLire;
  si ecrire alors                    |   < accès aux données protégées >
     debut                           |   fichier.finLire;
     cLire.attendre;                 |   fin
     cLire.signaler;                 |
     fin                             |
  fin                                | processus redacteur;
procedure finLire;                   |   debut
  debut                              |   fichier.debutEcrire;
  nbLecteurs := nbLecteurs - 1;      |   < accès aux données protégées >
  si (nbLecteurs = 0) alors          |   fichier.finEcrire;
     cEcrire.signaler                |   fin
  fin
procedure debutEcrire;
  debut
  si (ecrire ou (nbLecteurs > 0)) alors
     cEcrire.attendre;
  ecrire := vrai;
  fin
procedure finEcrire;
  debut
  ecrire := faux;
  si (nbLecteurs > 0) alors
     cLire.signaler;            // priorité aux lecteurs.
  sinon
     cEcrire.signaler;
  fin
procedure init;
  debut
  ecrire := faux;
  nbLecteurs := 0;
  fin



Alain Griffault 2003-05-07