T43 哲学家进餐问题 扩展碗的问题

设有 位哲学家,圆桌中心有 个碗,每两位哲学家之间有一根筷子。每个哲学家需要同时拿到一个碗和左右两根筷子才能进餐。

  • 考虑死锁条件
    • 时,死锁竞争资源为, 此时限制最多允许 位哲学家同时拿起碗
    • 时,死锁竞争资源为筷子, 此时限制最多允许 位哲学家同时拿起筷子
semaphore bowl = MIN(n-1, m); // 碗的数量
semaphore chopstick[n] = 1; // 每根筷子一个信号量
void philosopher(int i) {
    while (true) {
        think();
        P(bowl); // 申请碗
        P(chopstick[i]); // 申请左筷子
        P(chopstick[(i+1)%n]); // 申请右筷子
        eat();
        V(chopstick[(i+1)%n]); // 释放右筷子
        V(chopstick[i]); // 释放左筷子
        V(bowl); // 释放碗
    }
}