var mutex, wmutex, rwmutex:psemaphore; var readcount:integer; begin seminit(mutex.v,1;wmutex.v,1;rwmutex.v,1); readcount:=0; cobegin procedure reader; begin P(rwmutex); P(mutex); if readcount=0 then P(wmutex); readcount:=readcount+1; V(mutex); V(rwmutex); read P(mutex); readcount:=readcount-1; if readcount=0 then V(wmutex); V(mutex); end procedure writer; begin P(rwmutex); P(wmutex); writing is performing; V(wmutex); V(rwmutex); end coend end
var mutex,fullmutex:psemaphore; var seatcount:integer; begin seminit(mutex.v,1;fullmutex.v,1); seatcount:=0; cobegin procedure customer; begin P(mutex); if (seatcount=5) then P(fullmutex); seatcount:=seatcount+1; V(mutex); eat food P(mutex); seatcount:=seatcount-1; if (seatcount=0) then V(fullmutex); V(mutex); end coend end
var doormutex,entermutex:psemaphore; var incount:integer; begin seminit(doormutex.v,1;entermutex.v.0); incount:=0; cobegin procedure employee; begin P(doormutex); incount:=incount+1; V(doormutex); if (incount=5) begin V(entermutex); V(entermutex); V(entermutex); V(entermutex); V(entermutex); end P(entermutex); end coend end
var searchmutex,insertmutex,deletemutex; var searchcount; begin seminit(searchmutex.v,1;insertmutex.v,1;deletemutex.v,1); searchcount:=0; cobegin procedure search; begin P(searchmutex); if (searchcount=0) then P(deletemutex); searchcount:=searchcount+1; V(searchmutex); search P(searchmutex); searchcount:=searchcount-1; if (searchcount=0) then V(deletemutex); V(searchmutex); end procedure insert; begin SP(insertmutex,deletemutex); insert SV(insertmutex,deletemutex); end procedure delete; begin SP(insertmutex,deletemutex); delete SV(insertmutex,deletemutex); end coend end