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