桌上有一空盘,最多允许存放两只水果,爸爸只向盘中放一个苹果,妈妈只向盘中放一个桔子,两个儿子专等吃盘中的桔子,两个女儿专等吃苹果。用P、V操作实现爸爸、妈妈、儿子、女儿四个并发进程的同步。

放水果问题

桌上有一空盘,最多允许存放两只水果每次只能放入或是取出一只放一个苹果,爸爸只向盘中放一个苹果,妈妈只向盘中放一个桔子,两个儿子专等吃盘中的桔子,两个女儿专等吃苹果。用P、V操作实现爸爸、妈妈、儿子、女儿四个并发进程的同步与互斥的关系。

题目解析

由题目可知,这是一个经典的生产者——消费者问题的改编,爸爸相当于两个女儿,是生产者;妈妈相当于两个儿子,是生产者。

  1. 爸爸、妈妈、儿子、女儿四个角色之间的进程互斥,用mutex来表示;
  2. 对于爸爸和妈妈来说,每次放水果之前要确认盘子里面是否满了,用full表示盘子里面水果的数量;
  3. 对于儿子来说,每次取桔子之前都要确认盘子里面有没有桔子,用orange来表示盘子里面桔子的数量;
  4. 对于女儿来说,每次取苹果之前都要确认盘子里面有没有苹果,用apple来表示盘子里面苹果的数量;

代码

semaphore full=2,mutex=1,orange=0,apple=0;

void father()
{
	while(TRUE)
	{
		P(full);
		P(mutex);
		放苹果;
		V(mutex);
		V(apple); 
	}
}

void mother()
{
	while(TRUE)
	{
		P(full);
		P(mutex);
		放桔子;
		V(mutex);
		V(orange); 
	}
 } 
 
void son1(/son2) ()
{
 	while(TRUE)
 	{
 		P(orange);
 		P(mutex);
 		取桔子;
		V(mutex);
		V(full); 
	}
} 

void daughter1(/daughter2) ()
{
	while(TRUE)
	{
		P(apple);
		P(mutex);
		取苹果;
		V(mutex);
		V(full); 
	}
}

void main()
{
	cobegin
	father();mother();daughter1();
	daughter2();son1();son2();
	coend
}

你可能感兴趣的:(操作系统)