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