问题 问答题

我们将只读数据的进程称为“读者”进程,而写或修改数据的进程称为“写者”进程。允许多个“读者”同时读数据,但不允许“写者”与其他“读者”或“写者”同时访问数据。另外,要保证:一旦有“写者”等待时,新到达的“读者”必须等待,直到该“写者”完成数据访问为止。试用P,V操作正确实现“读者”与“写者”的同步。

答案

参考答案:本题设有两个共享变量: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;

单项选择题
判断题