生产者与消费者问题变式--奇偶数个数计算

问题描述

三个进程P1、P2、P3互斥使用一个包含N(N>0)个单元的缓冲区,P1每次用produce()生成一个正整数并用put()送入缓冲区某一个单元;P2每次用getodd()从该缓冲区中取出一个奇数并用countodd()统计奇数个数;P3每次用geteven()从该缓冲区中取出一个偶数,并用counteven()统计偶数个数。请用信号量机制实现这三个进程的同步与互斥活动。并说明所定义的信号量的含义(要求用伪代码描述)。 

 问题分析

这个问题就是基本的生产者和消费者问题的简单变化。在生产者和消费者问题中我们设置了empty和full信号量来满足空的缓冲区消费者不可以消费和满的缓冲区生产者不可以生产的这样的条件,在这个问题中,empty依旧保留让P1进程在缓冲区满的时候停止生产,用even和odd来让P2和P3进程在缓冲区空或者偶数为空或者奇数为空的时候停止消费(full信号量变成了even和odd两个信号量)

 代码

semaphore mutex = 1;		//缓冲区操作互斥信号量
semaphore even = 1;			//偶数进程的同步信号量
semaphore odd = 1;			//奇数进程的同步信号量
semaphore empty = N;		//缓冲区的个数


p1(){
	while(true){
		x = produce();
		P(empty);
		P(mutex);
		put();
		V(mutex);
		if(x%2 == 0){
			//如果产生的是偶数,则可以唤醒偶数进程
			V(even);
		}
		else{
			否则可以唤醒奇数进程
			v(odd);
		}
	}
}

P2(){
	while(true){
		P(odd);
		P(mutex);
		getodd();
		V(mutex);
		V(empty);
		countodd();
	}
}

P3(){
	while(true){
		P(even);
		P(mutex);
		geteven();
		V(mutex);
		V(empty);
		counteven();
	}
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值