<corpo> <codeblock> <name>readers and writers</name>: <kw>monitor</kw>
<idt></idt><kw>begin</kw> <name>readercount</name> : integer;
<idt></idt><idt></idt><name>busy</name>: Boolean;
<idt></idt><idt></idt><name>OKtoread</name>, <name>OKtowrite</name>:condition;
<idt></idt><idt></idt><kw>procedure</kw> <name>startread</name>;
<idt></idt><idt></idt><idt></idt><kw>begin</kw>
<idt></idt><idt></idt><idt></idt><idt></idt><kw>if</kw> <name>busy</name> V <name>OKtowrite</name>.queue <kw>then</kw> <name>OKtoread</name>.wait;
<idt></idt><idt></idt><idt></idt><idt></idt><name>readercount</name> := <name>readercount</name> + 1;
<idt></idt><idt></idt><idt></idt><idt></idt><name>OKtoread</name>.signal;
<idt></idt><idt></idt><idt></idt><idt></idt><comment>// Quando un lettore può iniziare, tutti possono</comment>
<idt></idt><idt></idt><idt></idt><kw>end</kw> <name>startread</name>;
<idt></idt><idt></idt><kw>procedure</kw> <name>endread</name>;
<idt></idt><idt></idt><idt></idt><kw>begin</kw>
<idt></idt><idt></idt><idt></idt><idt></idt><name>readercount</name> := <name>readercount</name> -- 1 ;
<idt></idt><idt></idt><idt></idt><idt></idt><kw>if</kw> <name>readercount</name> = 0 <kw>then</kw> <name>OKtowrite</name>.signal
<idt></idt><idt></idt><idt></idt><kw>end</kw> <name>endread</name>;
<idt></idt><idt></idt><kw>procedure</kw> <name>startwrite</name>;
<idt></idt><idt></idt><idt></idt><kw>begin</kw>
<idt></idt><idt></idt><idt></idt><idt></idt><kw>if</kw> <name>readercount</name> != 0 V <name>busy</name> <kw>then</kw> <name>OKtowrite</name>.wait
<idt></idt><idt></idt><idt></idt><idt></idt><name>busy</name> := true
<idt></idt><idt></idt><idt></idt><kw>end</kw> <name>startwrite</name>;
<idt></idt><idt></idt><kw>procedure</kw> <name>endwrite</name>;
<idt></idt><idt></idt><idt></idt><kw>begin</kw>
<idt></idt><idt></idt><idt></idt><idt></idt><name>busy</name> := false;
<idt></idt><idt></idt><idt></idt><idt></idt><kw>if</kw> <name>OKtoread</name>.queue <kw>then</kw> <name>OKtoread</name>.signal
<idt></idt><idt></idt><idt></idt><idt></idt><kw>else</kw> <name>OKtowrite</name>.signal
<idt></idt><idt></idt><idt></idt><kw>end</kw> <name>endwrite</name>;
<idt></idt><idt></idt><name>readercount</name> := 0;
<idt></idt><idt></idt><name>busy</name> := false;
<idt></idt><kw>end</kw> <name>readers and writers</name>;
</codeblock> </corpo> <autore>Lorenzo Viola</autore>