目录
1.问题描述
要求如下:
- 对缓冲区(盘子)的访问要互斥进行。
- 父亲将苹果放入盘子后,女儿才能取苹果。
- 母亲将橘子放入盘子后,儿子才能取橘子。
- 只有盘子为空时,父亲或母亲才能放入水果。
2.问题分析
分析题目中的同步与互斥关系。
题目中存在的互斥关系如下:
- 对缓冲区(盘子)的访问要互斥进行。
题目中存在的同步关系如下:
- 父亲将苹果放入盘子后,女儿才能取苹果。
- 母亲将橘子放入盘子后,儿子才能取橘子。
- 只有盘子为空时,父亲或母亲才能放入水果。
3.问题实现
3.1 初始化
semaphore mutex = 1;//实现互斥访问盘子(缓冲区)
semaphore apple = 0;//盘子中有几个苹果
semaphore orange = 0;//盘子中有几个橘子
semaphore plate = 1;//盘子中还可以放多少个水果
3.2 父亲
dad(){
while(1){
准备一个苹果;
P(plate);
P(mutex);
把苹果放入盘子;
V(mutex);
V(apple);
}
}
3.3 母亲
mom(){
while(1){
准备一个橘子;
P(plate);
P(mutex);
把橘子放入盘子;
V(mutex);
V(orange);
}
}
3.4 女儿
daughter(){
while(1){
P(apple);
P(mutex);
从盘子中取出苹果;
V(mutex);
V(plate);
吃掉苹果;
}
}
3.5 儿子
son(){
while(1){
P(orange);
P(mutex);
从盘子中取出橘子;
V(mutex);
V(plate);
吃掉橘子;
}
}