<!--StartFragment-->

int readcount, writecount; (initial value = 0)

semaphore mutex_1, mutex_2, mutex_3, w, r ; (initial value = 1)

READER

wait(mutex_3);

wait(r);

wait(mutex_1);

readcount := readcount + 1;

if readcount = 1 then wait(w);

signal(mutex_1);

signal(r);

signal(mutex_3);

reading is performed

wait(mutex_1);

readcount := readcount - 1;

if readcount = 0 then signal(w);

signal(mutex_1);

WRITER

wait(mutex_2);

writecount := writecount + 1;

if writecount = 1 then wait(r);

signal(mutex_2);

wait(w);

writing is performed

signal(w);

wait(mutex_2);

writecount := writecount - 1;

if writecount = 0 then signal(r);

signal(mutex_2);

<!--[if !supportEmptyParas]--> <!--[endif]-->