三个进程P1、P2、P3互斥使用一个包含N(N>0)个单元的缓冲区。
P1每次用produce()生成一个正整数并用put()送入缓冲区,p2每次用getodd()从缓冲区中取出奇数用countodd()进行统计,p3每次用geteven(...
P1每次用produce()生成一个正整数并用put( )送入缓冲区,p2每次用getodd()从缓冲区中取出奇数用countodd ( )进行统计,p3每次用geteven()从缓冲区中取出偶数用counteven ( )进行统计,
实现他们的同步与互斥关系! 展开
实现他们的同步与互斥关系! 展开
1个回答
展开全部
这个问题较为简单:与生产者一消费者问题非常类似,只不过涉及的进程多了一个。因此,我们可以用类似于生产者一消费者的解决方法来解决这个问题。不过,由于本问题的范围在生产者~消费者问题上进行了线性扩展,我们也需要对生产者~消费者的解决方案进行线性扩展,即增加适当数量的信号量。
解决要点如下:
(1)由于缓冲区是共享空间,我们设置一个互斥信号量来保护它。设信号量为mutex。
(2)P1、P2共享缓冲区的奇数数值,设同步信号量为odd。
(3)P1、P3共享缓冲区的偶数数值,设同步信号量为even。
(4)P1、P2、P3共享缓冲区的空位,设同步信号量为empty。
(5)所有进程均需进行down(mutex)和up(mutex)操作。
(6)P1需要进行down(empty)和up(odd)/up(even)之一的操作。
(7)P2需要进行down(odd)和up(empty)的操作。
(8)P3需要进行down(even)和]up(empty)的操作。
三个进程的实现如下:
P1:
while(true) {
integer=prodlace();//此行以下5行与生产者问题解答一样
down(empty);
down(mutex);
put();
up(mutex);
if(integer%2==0)//此处与生产者方案略有不同,需要进行判断,以决定唤醒P2、P3中的哪一个进程
up(even);
else
up(odd);
}
P2: 与消费者问题的解答几乎完全一样。
while(true) {
down(odd);
down(mutex);
getodd();
up(mutex);
up(empty);
countOdd();
}
P3: 与消费者问题的解答几乎完全一样。
while(true) {
down(even);
down(mutex);
getEven();
up(mutex);
up(empty);
countEven();
}
解决要点如下:
(1)由于缓冲区是共享空间,我们设置一个互斥信号量来保护它。设信号量为mutex。
(2)P1、P2共享缓冲区的奇数数值,设同步信号量为odd。
(3)P1、P3共享缓冲区的偶数数值,设同步信号量为even。
(4)P1、P2、P3共享缓冲区的空位,设同步信号量为empty。
(5)所有进程均需进行down(mutex)和up(mutex)操作。
(6)P1需要进行down(empty)和up(odd)/up(even)之一的操作。
(7)P2需要进行down(odd)和up(empty)的操作。
(8)P3需要进行down(even)和]up(empty)的操作。
三个进程的实现如下:
P1:
while(true) {
integer=prodlace();//此行以下5行与生产者问题解答一样
down(empty);
down(mutex);
put();
up(mutex);
if(integer%2==0)//此处与生产者方案略有不同,需要进行判断,以决定唤醒P2、P3中的哪一个进程
up(even);
else
up(odd);
}
P2: 与消费者问题的解答几乎完全一样。
while(true) {
down(odd);
down(mutex);
getodd();
up(mutex);
up(empty);
countOdd();
}
P3: 与消费者问题的解答几乎完全一样。
while(true) {
down(even);
down(mutex);
getEven();
up(mutex);
up(empty);
countEven();
}
网易云信
2023-12-06 广告
2023-12-06 广告
UIkit是一款轻量级、模块化、基于jQuery的UI框架,它提供了大量易于使用的UI组件,包括按钮、表单、表格、对话框、通知等等。UIkit的设计理念是尽可能地简洁和灵活,开发者可以根据自己的需求自由地选择需要的组件和样式,从而快速构建出...
点击进入详情页
本回答由网易云信提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询