3 个进程 P1、P2、P3 互斥地使用一个包含 N(N > 0)个单元的缓冲区。P1 每次用 produce() 生成一个正整数,并用 put() 将其送入缓冲区的某一空单元中 ;P2每次用 get

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

// 互斥信号量
mutex = 1;
// 共享内存中的偶数个数
even = 0;
// 奇数个数
odd = 0;
// 共享内存的剩余空间
empty = n;

p1(){
    while(true){
        p(empty);//等待有空位置
	num = produce();//生成正数
	p(mutex);//互斥
	put(num);//放入缓冲区
	v(mutex);//释放
	v(empty);//n中添加一个元素
	if(num % 2 == 0){
	    v(even);//偶数增加
	}else{
	    v(odd);//奇数增加
	}
    }
}


p2(){
    while(true){
	p(odd);//等待一个奇数
	p(mutex);//互斥
	getodd();//取出奇数
	countodd();//统计奇数个数
	v(mutes);//释放
	v(odd);//奇数个数减少
    }
}

p3(){
    while(true){
	p(event);//等待一个偶数
	p(mutex);//互斥
	geteven();//取出偶数
	counteven();//统计偶数个数
	v(mutes);//释放
	v(event);//偶数个数减少
    }
}
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值