进程同步与互斥之经典问题二

读者/写者问题

问题描述:


有两组并发进程:读者和写者,共享一组数据区
要求:

  • 允许多个读者同时进行读操作
  • 不允许读者、写着同时进行操作
  • 不允许多个写着同时进行操作

解答如下:
设置两个信号量并赋初值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)
}

请大家细细品味,这两个解法有什么区别?
如果大家看懂了信号量实现进程同步和互斥,那应该能看出其中的不同。

在下一篇博客中,我会继续讲同步与互斥经典问题三——哲学家就餐问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值