只要有一个Reader进程在读,便不允许Writer进程去写。因此,仅当readcount=0,表示尚无Reader进程在读时,Reader进程才需要执行wait(wmutex)操作;若wait(wmutex)操作成功,Reader进程便可去读,相应地,做readcount+1操作。
同理,仅当Reader进程在执行了readcount减1操作后其值为0时,才须执行signal(wmutex)操作,以便让Writer进程写。
Readcount是一个可被多个Reader进程访问的临界资源,因此,应该为它设置一个互斥信号量rmutex。
--Reader and Writer--
semaphore rmutex=1,wmutex=1; //定义两个信号量
int readcount=0;
void reader()
{
do{
wait(rmutex);//由于readcount是一个可被多个Reader进程访问的临界资源,因此设置一个互斥信号量rmutex
if(readcount==0) wait(wmutex);//如果读者数为0,则此时应该将w互斥量减1
readcount++;//读者数+1
signal(rmutex);//释放r互斥量
...
perform read operation;
...
wait(rmutex);//每次访问readcount时都要使互斥信号量rmutex-1
readcount--;
if(readcount==0)signal(wmutex);
signal(rmutex);
}while(TRUE);
}
void writer()
{
do{
wait(wmutex);//若wmutex=1,则-1进入下面的操作;若wmutex=0,原地等待。
perform write operation;
signal(wmutex);//释放wmutex
}while(TRUE)
}
void main()
{
cobegin//并行开始
reader();writer();
coend;//并行结束
}