PV操作经典例题——吃水果

例1:桌上有一个盘子,每次只能放一个水果,妈妈向盘中放苹果和橘子,儿子专等吃盘里的橘子,女儿专等吃盘里的苹果。只要盘子空,妈妈可向盘中放水果,仅当盘中有自己需要的水果时,儿子或女儿可从中取出,请给出他们三人之间的同步关系,并用PV操作实现三人正确活动的程序。

分析:女儿和儿子各取所需,不存在争夺资源的问题,所以不存在互斥关系。女儿儿子需要获知苹果橘子是否产生信号,所以设苹果资源信号量为apple,橘子资源信号量为orange。而妈妈需要获知盘子是否为空的信号,所以需要设置资源信号量empty。
解:设empty=1; orange=0; apple=0;

void mother()
{
	while(true)
	{
		wait(empty);
		produce fruit;
		if( fruit=='苹果'signal(apple);//apple++,告知女儿有苹果了
		else
			signal(orange);//orange++,告知儿子有橘子了
	}
}
void daughter()
{
	while(true)
	{
		wait(apple);
		//取水果
		signal(empty);//empty++,告知妈妈盘子空了
	}
}
void son()
{
	while(true)
	{
		wait(orange);
		//取水果
		signal(empty);//empty++,告知妈妈盘子空了
	}
}

例2:如果是爸爸放橘子,妈妈只负责放苹果,儿子和女儿角色不变,请给出他们四人之间的同步关系,并用PV操作实现四人人正确活动的程序。

分析:妈妈和爸爸对盘子的使用存在互斥关系,所以需要设互斥信号量mutex。父亲和儿子,母亲和女儿都是同步关系。
解:设mutex=1; orange=1; apple=1;

void mother()
{	
	while(true)
	{
		wait(mutex);//申请临界资源
		produce apple;
		signal(apple);//apple++,告知女儿有苹果了
	}
}
void father()
{
	while(true)
	{
		wait(mutex);
		produce orange;
		signal(orange);//orange++,告知儿子有苹果了
	}
}
void daughter()
{	
	while(true)
	{
		wait(apple);
		//取水果
		signal(mutex);//empty++,告知妈妈盘子空了
	}
}
void son()
{	
	while(true)
	{
		wait(orange);
		//取水果
		signal(mutex);//empty++,告知妈妈盘子空了
	}
}

例3:如果有两个女儿,两个儿子,盘子可容纳两个水果,爸爸放橘子,妈妈放苹果,儿子吃橘子,女儿吃苹果,请给出他们六人之间的同步关系,并用PV操作实现六人人正确活动的程序。
解析:妈妈和爸爸对盘中放水果的操作存在互斥关系,大儿子和小儿子同样对盘中取橘子的操作存在互斥关系,大女儿和二女儿亦是如此。所以儿子和女儿取水果的过程需要被保护起来。
解:设mutex=1; empty=2; orange=1; apple=1;

void mother()
{	
	while(true)
	{
		wait(empty);
		wait(mutex);//申请(盘子)临界资源
		produce apple;
		signal(mutex);
		signal(apple);//apple++,告知女儿有苹果了
	}
}
void father()
{
	while(true)
	{
		wait(empty);//申请放水果的空位置
		wait(mutex);//申请(盘子)临界资源
		produce orange;
		signal(mutex);
		signal(orange);//orange++,告知儿子有苹果了
	}
}
void daughter()
{	
	while(true)
	{
		wait(apple);
		wait(mutex);
		//取水果
		signal(mutex);
		signal(empty);//empty++,告知妈妈盘子空了
	}
}
void son()
{	
	while(true)
	{
		wait(orange);
		wait(mutex);
		//取水果
		signal(mutex);
		signal(empty);//empty++,告知妈妈盘子空了
	}
}

例题3是典型的生产者—消费者问题。

  • 27
    点赞
  • 189
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值