面试题答案
一键面试- 信号量设置:
- 设置一个互斥信号量
mutex
,初始值为1,用于保护共享资源(如对餐具状态的修改等临界区操作)。 - 设置一个数组
semaphore chopstick[n]
,其中n
为哲学家的数量,每个chopstick[i]
初始值为1,代表每根筷子可用。
- 设置一个互斥信号量
- 拿取餐具操作流程:
- 哲学家
i
首先获取mutex
信号量,进入临界区。 - 检查左右两根筷子(假设
i
的左边筷子为i
,右边筷子为(i + 1) % n
)是否都可用。 - 如果都可用,获取左边筷子
chopstick[i]
,再获取右边筷子chopstick[(i + 1) % n]
。 - 释放
mutex
信号量,离开临界区,开始用餐。
- 哲学家
- 释放餐具操作流程:
- 哲学家
i
用餐完毕后,首先获取mutex
信号量,进入临界区。 - 释放右边筷子
chopstick[(i + 1) % n]
,再释放左边筷子chopstick[i]
。 - 释放
mutex
信号量,离开临界区。这样通过信号量的合理使用,可以避免死锁,因为每次拿取筷子前先获取mutex
确保对筷子资源的访问是互斥的,避免了循环等待导致的死锁情况。
- 哲学家