进程同步互斥与P-V操作中的读者-写者问题

内容接上一篇文章
经典同步互斥问题:读者-写者问题
问题描述:对于一本书
读者读书;有多个读者
编者写书;有多个编者
约束条件
允许多个读者同时读;
不允许读者、编者同时操作;
不允许多个编者同时操作;

读者和编者的行为用两个进程的伪代码表示出来,i表示可以有多个读者和写者进程,并且他们是并发的:
在这里插入图片描述
分析这个问题的要求,需要实现的约束条件如下:
1.编者之间的互斥;
2.编者跟读者之间的互斥;
3.读者之间不互斥;
4.读者的个数。

第一步,实现编者之间的互斥关系,不允许多个编者同时编书,那么在编者进程的“编书”事件前,加上P操作,在“编书”事件完成之后,加上V操作,P-V这组操作的信号量为 int editor=1; /互斥量:编者对编者和读者的互斥/
在这里插入图片描述
第二步,实现编者和读者的互斥关系,当写者在编书的时候,不允许读者读书,当读者读完书后才运行写者编书,所以读者进程的“读书”事件前后,也要加上互斥信号量的P-V操作。
在这里插入图片描述
现在看起来已经完成了约束要求的1、2条了,但是第3个条件“读者之间不互斥”,上图读者进程加上的这对P-V操作已经让读者进程处于互斥关系了,不允许多个读者同时读书,不符合第三个要求。因此要对读者进程加以改进,定义一个读者个数变量,初始化为0:
int ReadCount=0; /读者计数/
每次有读者进入读者进程来读书时,就把计数器ReadCount值加1
当只有一个读者的时候,就执行限制写者“编书”事件的互斥P操作,当读者数量大于1的时候,不限制读者“读书”事件,不执行P操作。
同样的,对“读书”事件后的V操作,也加上对应的限制条件,那么得到如下代码:
在这里插入图片描述
然而,完了吗?还没有完。我们看到读者进程中对ReadCount这个变量的操作出现在了两个地方,当有多个读者运行读者进程时,很可能会同时操作ReadCount的值,以至计数器的值会出现混乱,因而ReadCount变量对于读者进程而言是个临界资源,一次只能够让一个进程操作该变量,所以多个读者进程在使用ReadCount变量时是互斥的。
那么在操作ReadCount变量的事件前后,加上互斥信号的P-V操作,定义信号量:
int mutex=1; /互斥量:ReadCount是临界资源/
在这里插入图片描述
到这里,题目就全部做完了,最后的结果如下图:
在这里插入图片描述

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值