moniteur allocateur = bool occ init faux condition f procedure acquerir = si occ alors f.WAIT ; occ := vrai. procedure liberer = occ := faux ; f.SIGNAL. fin |
moniteur pc = tp[0 .. k-1] de valeurs in,out : 0..k-1, init 0 nbocc : 0 .. k init 0 condition fp,fc init vide procedure prod(x) = si non nbocc < k alors fp.WAIT tp[in] := x in := (in +1) mod k nbocc ++ fc.SIGNAL fin prod procedure cons(x) = si non nbocc > 0 alors fc.WAIT x := tp[out] out := (out +1) mod k nbocc-- fp.SIGNAL fin cons fin |
L'invariant I = 0 <= occupees <= k et 0 <= in, out <= k-1 et les cases occupées se trouvent entre out et in.
{ I } P { I } : lorsqu'on exécute une procédure P, on vérife que l'invariant est bien respecté (c'est le cas).
On utilise les ressources en écrivant : allocateur.acquerir, allocateur.liberer, pc.prod(x), pc.cons(x). |