• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

设有三个进程A、B、C,其中A与B构成一对生产者与消费者(A为生产者,B为消费者),共 ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
生产者消费者问题
设信号量mutex1, mutex2, full1, full2, empty1, empty2分别表示1和2号缓冲区的访问互斥, 是否满, 是否空
semaphore mutex1 = 1, empty1 = n, full1 = 0;
semaphore mutex2 = 1, empty2 = m, full2 = 0; 
void A()//向缓冲池1添加商品
{
	while(1)
	{
		produce next product1;
		p(empty1);//检测当前缓冲池是否为空,如果为空(说明我A需要向里面放东西了),则进行下一步,否则,阻塞本进程
		p(mutex1);//检测是否可以进入缓冲区(即检测缓冲区中是否有其他进程),若可以则自己进去并锁上门,否则,阻塞本进程
			buffer1(i) = product1;//将商品放入缓冲区1
			i = (i + 1) % n;//缓冲队列的尾指针后移
		v(mutex1);//放完商品,离开缓冲区,释放互斥访问锁,允许其他进程进入
		v(full1);//通知进程B,我已放好商品,你可以来取了
	}
}

void B()//从缓冲区1中取出商品,放到缓冲区2
{
	while(1)
	{
		p(full1);// 先检测缓冲区1内是否有货
		p(mutex1);// 有货,再检测缓冲区1是否有其他进程正在访问,没有的话,自己进去并锁上门
			goods = buffer1(j);//取货
			j = (j + 1) % n; //缓冲队列队首指针后移
		v(mutex1);// 取完货后,释放缓冲区1的互斥访问锁
		v(empty1);// 提示A我取出货了,你可以接着往里面放了
			Consume goods and Produce next product2;
		p(empty2);// 检测缓冲区2是否为空
		p(mutex2);// 检测当前缓冲区中是否有其他进程
			buffer2(a) = product2;// 向2号缓冲区放置商品
			a = (a + 1) % m;// 2号缓冲区缓冲队列队尾指针后移
		v(mutex2);// 离开缓冲区2,释放锁
		v(full2);// 通知C进程可以来取货了(我已经放进去商品了,你可以来取了)
	}
}

void C()
{
	while(1)
	{
		p(full2);// 检测2号缓冲区内是否有货
		p(mutex2);//若有货,加锁,进入
			goods = buffer2(b);//取出商品
			b = (b + 1) % m;//2号缓冲区队首指针后移
		v(mutex2);// 离开缓冲区2,释放锁
		v(empty2);// 通知B进程,我已经取出商品,你可以继续往里面放了
		Consume product;
	}
}

int main()
{
	parbegin(A(), B(), C());//A,B,C三个进程并发执行
}

  


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
[C++/CLI编程宝典][3]C++/CLI能做什么发布时间:2022-07-13
下一篇:
C#SqlDataAdapter的学习发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap