【正确答案】
【答案解析】本题设有两个共享变量:readcount,writecount,记录读者数量与写者数量,初值为0;两个互斥信号量rmutex,mutex,用于互斥的访问共享变量,初值为1;一个信号量S,使写者与后续读者之间的互斥,初值为1;一个信号量wmutex,使写者到达之前的读者可以顺序读完且写者与写者之间的互斥,初值为1。
读者:
repeat
wait(s);∥若S已经为0表明有写者到达则后续读者必须等待
wait(rmutex);
readcount++:
if(readcount=1)wait(wmutex);∥第一个读者读时,阻止写者写
signal(rmutex);
signal(s);
读
wait(rmutex);
readcount--:
if(readcount=0)then signal(wmutex);∥最后一个前续读者读完时,
允许写者写。
signal(rmutex);
until false;
写者:
Repeat
Wait(mutex);
If writecount=0 then wait(s);∥如果是第一个写者将S置为0,则后续读者必须等待。
Writecount:=writecount+1;
Signal(mutex);
wait(wmutex);∥写者之间互斥写
写;
signal(wmutex);
Wait(mutex);
Writecount:=writecount-1;
If writecount=0 then signal(s);∥若写者都写完,则S加1
Signal(mutex);
until flase;