monitor Serwer; var zasob_wolny: array[1..M] of (true,false) := (M times true); czekanie_na_zasob: array[1..M] of condition; export procedure rezerwuj_zasoby(potrzebne_zasoby: array[1..K] of (1..M)) var i: integer; zasob: (1..M); begin sort(potrzebne_zasoby); for i:=1 to K do begin zasob := potrzebne_zasoby[i]; if (zasob_wolny[zasob]=false) wait(czekanie_na_zasob[zasob]); zasob_wolny[zasob]:=false; end; end; export procedure zwolnij_zasoby(potrzebne_zasoby: array[1..K] of (1..M)) var i: integer; zasob: (1..M); begin sort(potrzebne_zasoby); for i:=1 to K do begin zasob := potrzebne_zasoby[i]; zasob_wolny[zasob] := true; signal(czekanie_na_zasob[zasob]); end; end; begin end; process P var potrzebne_zasoby: array of (1..M); begin while (true) do begin wlasne_sprawy(); potrzebne_zasoby := wyznacz_potrzebne_zasoby(); Serwer.rezerwuj_zasoby(potrzebne_zasoby); pracuj(potrzebne_zasoby); Serwer.zwolnij_zasoby(potrzebne_zasoby); end; end;