关于父亲放水果pv原语的题目
2013-06-28 23:55
459 查看
【例2】桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。 分析 在本题中,爸爸、儿子、女儿共用一个盘子,盘中一次只能放一个水果。当盘子为空时,爸爸可将一个水果放入果盘中。若放入果盘中的是桔子,则允许儿子吃,女儿必须等待;若放入果盘中的是苹果,则允许女儿吃,儿子必须等待。本题实际上是生产者-消费者问题的一种变形。这里,生产者放入缓冲区的产品有两类,消费者也有两类,每类消费者只消费其中固定的一类产品。
解:在本题中,应设置三个信号量S、So、Sa,信号量S表示盘子是否为空,其初值为l;信号量So表示盘中是否有桔子,其初值为0;信号量Sa表示盘中是否有苹果,其初值为0。
同步描述如下:
int S=1;
int Sa=0;
int So=0;
main()
{
cobegin
father(); /*父亲进程*/
son(); /*儿子进程*/
daughter(); /*女儿进程*/
coend
}
father()
{
while(1)
{
P(S); 将水果放入盘中;
if(放入的是桔子)
V(So);
else
V(Sa);
}
}
son()
{
while(1)
{
P(So);
从盘中取出桔子;
V(S);
吃桔子;
}
}
daughter()
{
while(1)
{
P(Sa);
从盘中取出苹果;
V(S);
吃苹果;
}
}
解:在本题中,应设置三个信号量S、So、Sa,信号量S表示盘子是否为空,其初值为l;信号量So表示盘中是否有桔子,其初值为0;信号量Sa表示盘中是否有苹果,其初值为0。
同步描述如下:
int S=1;
int Sa=0;
int So=0;
main()
{
cobegin
father(); /*父亲进程*/
son(); /*儿子进程*/
daughter(); /*女儿进程*/
coend
}
father()
{
while(1)
{
P(S); 将水果放入盘中;
if(放入的是桔子)
V(So);
else
V(Sa);
}
}
son()
{
while(1)
{
P(So);
从盘中取出桔子;
V(S);
吃桔子;
}
}
daughter()
{
while(1)
{
P(Sa);
从盘中取出苹果;
V(S);
吃苹果;
}
}
相关文章推荐
- 【C语言】再次找的一些C语言题目,关于折半查找和某些种种
- 关于数组和指针比较经典的题目
- (第20讲)关于排序的各种算法的汇总的题目
- 九度题目1107:搬水果
- 关于Online Judge题目tick and tick的数学公式推导
- 一道题目引发的关于c++命名域的问题--Avoid hiding inheried names
- 关于上次公共子串题目100分解法(pascal)
- 《深入理解计算机系统》上的一道题目,关于位的。
- 关于某刑侦考试题目
- 【编程题目】求单向链表的倒数第k个节点——关于代码鲁棒性的探讨(C++实现)
- 一道关于string的题目
- 推荐2个视频 关于父亲
- PAT上面一道关于“月饼”的题目的解法
- 关于二叉树的二叉链表存储结构的两道题目
- 关于切图的一道题目
- [Jobdu] 题目1420:Jobdu MM分水果
- 关于一些挑战题目
- 360一道关于this的题目
- 一道关于javascript数据类型题目的思考
- 关于搜狗在线测评上面的题目详解