取放水果问题(生产者-消费者问题的变形)

题目:

桌上有个能剩得下五个水果的空盘子。爸爸不停地向盘中放苹果和桔子,儿子不停地从盘中取出桔子享用,女儿不停地从盘中取出苹果享用。规定三人不能同时从盘子中取放水果。试用信号量实现爸爸、儿子和女儿这三个循环进程之间的同步(来源:《计算机操作系统学习指导与题解》)。

学过生产者-消费者的你应该能立刻看出此题其实是生产者-消费者的变形。
生产者是父亲,能生产出两种产品;消费者是儿子和女儿(一个消费桔子,一个消费苹果)。

有五个空盘子,相当于有五个缓冲池。

设置信号量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);
    享用苹果;
  }
}

你可能感兴趣的:(取放水果问题(生产者-消费者问题的变形))