mutex:互斥信号量,初值为1,用于使读进程互斥地访问共享变量readcount ;
wmutex:写互斥信号量,初值为1,用于实现写进程与其他进程(包括读进程与其他写进程)的互斥;
readcount:共享变量,初值为0,用于记录当前正在读数据集的读进程数目;
当一个读进程要读数据集时,readcount加1;如果此前(readcount加1之前)数据集中无读进程,应该对写互斥信号量wmutex做P操作,这样若数据集中无写进程则通过P操作阻止后续写进程写,若数据集中有写进程,则通过P操作让读进程等待。
类似的,当一个读进程完成读数据集的操作时,应将读进程计数readcount减1;如果此时(readcount减1后)数据集中已无读进程,还应该对写互斥信号量wmutex做V操作,以允许写进程写。
算法描述如下:
semaphore mutex=1;
semaphore wmutex=1;
int readcount=0;
main()
{
cobegin
reader();
writer();
coend
}
reader()
{
while(true)
{
p(mutex);
if(readcount==0) p(wmutex);//当第一个读进程读数据集时,阻止写进程写
readcount++;
v(mutex);
读数据集;
p(mutex);
readcount--;
if(readcount==0) v(wmutex);//当最后一个读进程读完数据集后,允许写进程写
v(mutex);
}
}
writer()
{
while(true)
{
p(wmutex)
写数据集;
v(wmutex);
}
}