Os PV操作 进程同步 生产者消费者

题目

桌子上有一个盘子,每次只能放入一个水果。爸爸专门放苹果,妈妈专门放橘子,儿子专门吃橘子,女儿专门吃苹果。请用 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();
    }
}

[解析]

这是一道经典的生产者-消费者问题的变种。关键点是:

  1. 盘子是互斥资源,用 plate 信号量控制
  2. 爸爸和妈妈是苹果/橘子的生产者
  3. 儿子和女儿分别是橘子/苹果的消费者
  4. 吃之前要先从盘子里拿走对应的水果