进程互斥、进程同步,信号量
要求:允许几个读者可以同时读该数据集,而一个写者不能与其他进程(不管是读者还是写者)同时访问该数据集。
两类进程:读进程、写进程
互斥关系:读进程-写进程,写进程-写进程(读进程与读进程不存在互斥关系)
semaphore rw=1;//互斥访问数据集的信号量
int count=0;//记录访问数据集的读进程数(用来实现读进程之间不发生互斥)
semaphore mutex=1;//互斥修改count值的信号量
writer(){//写者进程
while(1){
P(rw);//相当于加锁(rw=1时说明数据集没有进程访问),rw--
write;//写操作
V(rw);//相当于解锁(恢复rw=1),rw++;
}
}
writer(){//写者进程
while(1){
P(rw);//相当于加锁(rw=1时说明数据集没有进程访问),rw--
write;//写操作
V(rw);//相当于解锁(恢复rw=1),rw++;
}
}
reader(){//读者进程
while(1){
P(mutex);//在判断count值之前先对count加锁,防止判断之后count被修改
if(count==0){//先判断是否应该对数据集加锁,如果是第一个读进程(count=0)就要进行加锁;如
//果已经有读进程正在访问数据集(count>0),则跳过加锁直接访问
P(rw);//对数据集加锁
}
count++;//修改count,把自己的进程算进总读进程数
V(mutex);//修改count后,将修改count的锁解除
read;//读操作
P(mutex);//在执行完读操作后意味着该进程将要停止访问数据集,就要修改count,同样也要加锁
count--;//修改count
if(count==0){//需要判断是否应该对数据集解锁,如果已经没有读进程(count=0)就要进行解锁;
//如果还有读进程正在访问数据集(count>0),则跳过解锁直接退出
V(rw);//对数据集解锁锁
}
V(mutex);//修改count后,将修改count的锁解除
}
}