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); // 释放碗
}
}