读者/写者问题
问题描述:
有两组并发进程:读者和写者,共享一组数据区
要求:
- 允许多个读者同时进行读操作
- 不允许读者、写着同时进行操作
- 不允许多个写着同时进行操作
解答如下:
设置两个信号量并赋初值mutex=1和w=1
设置一个全局变量readcount=0,表示当前有几个读者在读
mutex作用:读者与读者之间实现互斥,不允许多个读者进程同时修改readcount
w作用:实现读者与写者、写者与写者之间的互斥
代码如下(如有不懂,可以在下面留言,一起交流):
read{
P(mutex)
readcount++
if(readcount==1) P(w)
V(mutex)
读操作
P(mutex)
readcount--
if(readcount==0) V(w)
V(mutex)
}
write{
P(w)
写操作
V(w)
}
第二种解答如下:
新增一个信号量并赋初值S=1
read{
P(S)
P(mutex)
readcount++
if(readcount==1) P(W)
V(mutex)
V(S)
读操作
P(mutex)
readcount--
if(readcount==0) V(S)
V(mutex)
}
write{
P(S)
P(W)
写操作
V(W)
V(S)
}
请大家细细品味,这两个解法有什么区别?
如果大家看懂了信号量实现进程同步和互斥,那应该能看出其中的不同。
在下一篇博客中,我会继续讲同步与互斥经典问题三——哲学家就餐问题