问题: 首先,有一个共享文件,可以让同时多个读者读,但只要有一个读者在读,就不允许写者写文件,即是说当写者写的时候,只允许一个写者写,其他到来的读者和新到来的
写者等待.
首先,我们设定一个互斥信号量 :mutex来对读者数量的限制,初始化为1,对写者定义一个信号量:write,初始值为1,再定义一个整型:count ,初始化值为0,当它为0时,则表面下面一个
到来的读者为第一个读者,为1的话代表有其他读者的到来.而读者与写者是不能同时进行的,所以具体信号量的P,V操作如下:
int mutex = 1; //用于记录读者的互斥信号量
int write = 1; //用于写者的信号量,无论什么时候只允许一个写者
int count = 0; //记录读者的数量
//主函数
main()
{
Cobegin:
read(); //读者优先
write();
Coend;
}
//读者进程
read ()
{
while(true)
{
p(mutex);
if(count==0) //一开始写者不能写,这是读者优先算法
p(write); //执行此操作,阻塞写者进程
count++; //记录读者的数量
v(mutex);
读文件();
P(mutex);
count--;
if(count==0)
V(write); //如果此时读者数量为0,写者才可以写,因此执行V操作唤醒写者进程
V(mutex);
}
}
//写者进程
write()
{
while(true)
{
P(write);
写文件();
V(write);
}
}
这只是读者优先的算法,后面还有写者优先等等,大家可以自行百度了解一下,其实原理都一样,要分清楚哪个是先做,哪一步骤的优先级比较高~~~