The Readers and Writers Problem.
(Concurrent readers OR exclusive Writer).
All readers execute reader-entry at start and reader-exit on end of reading zone. Similar for writers. Mutex semaphores are initialized to 1 and others (rsem, wsem) are initialized to 0. the variables rc, wc, rwc and wwc are counters (reader count, reader waiting count etc) and a inited to 0.
PROGRAM 1: Has writer starvation.
Reader Entry Writer Entry
P(mutex); P(wsem)
rc++;
if rc=1 then P(wsem);
V(mutex);
Reader Exit Writer Exit
P(mutex); V(wsem)
rc--;
if rc=0 then V(wsem);
V(mutex);
PROGRAM 2: Has reader starvation
Reader Entry
P(rsem);
V(rsem)
P(rmutex);
rc++
if rc=1 then P(wsem);
V(rmutex);
Reader Exit
P(rmutex);
rc--;
if rc=0 then V(wsem);
V(rmutex);
Writer Entry
P(wmutex);
wc++;
if wc=1 then P(rsem);
V(wmutex);
P(wsem);
Writer Exit
V(wsem);
P(wmutex);
wc--;
if wc=0 then V(rsem);
V(wmutex);
PROGRAM 3: Correct Solution - version A
Reader Entry
P(mutex);
if (wwc>0) or (wc>0) then begin
rwc++;
V(mutex);
P(rsem);
P(mutex);
rwc--; end;
rc++;
V(mutex);
Reader Exit
P(mutex);
rc--;
if (rc=0) and (wwc>0) then V(wsem);
V(mutex);
RW3
Writer Entry
P(mutex);
if (rc>0)or(wc>0)or(rwc>0)or(wwc >0)
then begin
wwc++;
V(mutex);
P(wsem);
P(mutex);
wwc--; end;
wc++;
V(mutex);
Writer Exit
P(mutex);
wc-- ;
if (rwc>0) then
for i:=1 to rwc do V(rsem)
else if (wwc>0) then V(wsem);
V(mutex)
PROGRAM 4: Correct Solution - version B
Reader Entry
P(mutex);
if (wwc>0) or (wc>0) then begin
rwc++;
V(mutex);
P(rsem);
rwc--;
end;
rc++;
if rwc>0 then V(rsem)
else V(mutex);
Reader Exit
P(mutex);
rc--;
if (rc=0) and (wwc>0) then V(wsem);
else V(mutex); RW4
Writer Entry
P(mutex);
if (rc>0)or(wc>0)
then begin
wwc++;
V(mutex);
P(wsem);
wwc--;
end;
wc++;
V(mutex);
Writer Exit
P(mutex);
wc-- ;
if (rwc>0) then V(rsem)
else
if (wwc>0) then V(wsem);
else V(mutex)