终于等到高阶版了,加油加油!
一、问题描述
桌上有一个盘子,最多可以容纳两个水果,每次只能放入或者取出一个水果,爸爸专门向盘子放入苹果,妈妈专门向盘子放入橘子,要求两人交替放入水果;有两儿两女,儿子每次拿一个橘子吃,女儿每次拿一个苹果吃。请使用信号量和PV操作求解该问题。
📕题目的变化无非是:
1.缓冲区大小为2,在1和N之间
2.交替放入水果,不能连续两次放入同一种水果
(后面还会更新一道题目,对交替放入没有限制,暂时称为高阶版变式)
二、问题求解
🔑:
semaphore singal=1; //两人交替放入水果
semaphore mutex=1;
semaphore appleFull=0;
semaphore orangeFull=0;
semaphore appleEmpty=1;
semaphore orangeEmpty=1;
//这道题其实可以看作两个人分别互斥访问两个大小为1橘子及苹果缓冲区
//拆开来做可以当作
Father()
{
while(1)
{
P(singal);
P(appleEmpty);
P(mutex);
放入一个苹果;
V(mutex);
V(appleFull); //告诉两个女儿:可以拿苹果吃啦
V(singal); //给妈妈发信号:可以放橘子啦
}
}
Mother()
{
while(1)
{
P(singal);
P(orangeEmpty);
P(mutex);
放入一个橘子;
V(mutex);
V(orangeFull); //告诉两个儿子:可以拿橘子吃啦
V(singal); //给爸爸发信号:可以放苹果啦
}
}
Son-i(i=1,2)
{
while(1)
{
P(orangeFull);
P(mutex);
拿一个橘子;
V(mutex);
P(orangeEmpty);
}
}
Datughter-i(i=1,2)
{
while(1)
{
P(appleFull);
P(mutex);
拿一个苹果;
V(mutex);
V(appleEmpty);
}
}
看到这里,可能有人比较迷糊了,但是别怕,一遍遍体会PV操作的微妙~
三、思考
📋不妨设想一下,让两个女儿或者两个儿子进行互斥取水果怎么办?
是不是要再设置一个信号量呢?
今天到这里啦,溜啦~