题目
桌子上有一个盘子,每次只能放入一个水果。爸爸专门放苹果,妈妈专门放橘子,儿子专门吃橘子,女儿专门吃苹果。请用 PV 操作实现四人之间的同步与互斥关系。
[答案]
semaphore plate = 1; // 盘子是否为空
semaphore apple = 0; // 盘中是否有苹果
semaphore orange = 0; // 盘中是否有橘子
void father() {
while (1) {
prepare_apple();
wait(&plate);
put_apple_on_plate();
signal(&apple);
}
}
void mother() {
while (1) {
prepare_orange();
wait(&plate);
put_orange_on_plate();
signal(&orange);
}
}
void son() {
while (1) {
wait(&orange);
take_orange_from_plate();
signal(&plate);
eat_orange();
}
}
void daughter() {
while (1) {
wait(&apple);
take_apple_from_plate();
signal(&plate);
eat_apple();
}
}
[解析]
这是一道经典的生产者-消费者问题的变种。关键点是:
- 盘子是互斥资源,用
plate信号量控制 - 爸爸和妈妈是苹果/橘子的生产者
- 儿子和女儿分别是橘子/苹果的消费者
- 吃之前要先从盘子里拿走对应的水果