题目:
桌上有个能剩得下五个水果的空盘子。爸爸不停地向盘中放苹果和桔子,儿子不停地从盘中取出桔子享用,女儿不停地从盘中取出苹果享用。规定三人不能同时从盘子中取放水果。试用信号量实现爸爸、儿子和女儿这三个循环进程之间的同步(来源:《计算机操作系统学习指导与题解》)。
学过生产者-消费者的你应该能立刻看出此题其实是生产者-消费者的变形。
生产者是父亲,能生产出两种产品;消费者是儿子和女儿(一个消费桔子,一个消费苹果)。
有五个空盘子,相当于有五个缓冲池。
设置信号量semaphore empty = 5, orange = 0, apple = 0, mutex = 1;(初始5个盘子都为空,儿子和女儿都没拿到水果,三人不能同时操作,意味着只有一个临界资源。)
Dad() {
while (1) {
wait(empty);//如果先申请临界资源再申请空盘子,则可能出现申请临界资源成功却因为申请空盘子失败而阻塞,结果后面的进程想申请临界资源却无法申请而阻塞,造成连锁反应;
wait(mutex);
将水果放入盘中;
signal(mutex);
if (放入的是桔子) {
signal(orange);
}
else signal(apple);
}
}
Son() {
while (1) {
wait(orange);
wait(mutex);
从盘中取一个桔子;
signal(mutex);
signal(empty);
享用桔子;
}
}
Daughter() {
while (1) {
wait(apple);
wait(mutex);
从盘中取一个苹果;
signal(mutex);
signal(empty);
享用苹果;
}
}