readers and writers: monitor // il monitor dei lettori e scrittori
begin readercount : integer;
busy: Boolean; // detto prima del controllo se qualcuno scrive
OKtoread, OKtowrite: condition; // condizioni

procedure startread; // inizia la procedura
begin
if busy || OKtowrite.queue then OKtoread.wait; // controlla se c'รจ una scrittura in attesa per bloccare il prossimo lettore
readercount := readercount + 1;
OKtoread.signal;
// dopo che un lettore inizia iniziano quelli in coda dopo
end startread; // fine iniziolettura

procedure endread; // finelettura
begin
readercount := readercount - 1 ; // leva i lettori in coda
if readercount = 0 then OKtowrite.signal // appena finiscono si scrive
end endread; // fine finelettura

procedure startwrite; // inizio scrittura
begin
if readercount != 0 || busy then OKtowrite.wait // se ci sono lettori aspetta la scrittura
busy := true
end startwrite; // fine inizioscrittura

procedure endwrite; // procedura finescrittura
begin
busy := false;
if OKtoread.queue then OKtoread.signal
else OKtowrite.signal // continua a fare entrare in scrittura
end endwrite; // fine finescrittura

readercount := 0;
busy := false;
end readers and writers; // finito tutto
Lorenzo Viola