Dining Philosophers problem
哲学家就餐问题
题目描述:
有 \(5\) 位哲学家围坐在一张圆桌旁,桌子中央放有一盘通心面,每人面前有一只空盘子,每两人之间放一把叉子;每位哲学家思考、饥饿,然后吃通心面;为了吃面,哲学家必须获得两把叉子,且每人只能从紧邻自己的左边或右边去取叉子。
为了避免 \(5\) 名哲学家同时拿起一边筷子导致死锁,有几种方法:
- 至多允许 \(4\) 名哲学家同时吃通心面;
- 引入服务员,哲学家必须经过他的允许才能拿叉子;
- 奇数号哲学家先取左边叉子,再取右边叉子;偶数号哲学家先取右边叉子,再取左边叉子;
- 每位哲学家取到手边的两把叉子才开始吃通心面,否则一把叉子都不取。
另外还有资源分级解法、AND 型信号量机制解法等。
在列出的解法中,第 2 种方法的并发性很低,王道就是采用这种写法;第 3 种方法和第 4 种方法实现起来不如第 1 种简单。
综合考虑,这道题采用第 1 种解法,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
semaphore limit = 4; // 最多允许 4 名哲学家同时吃饭
semaphore chopstick[5] = {1, 1, 1, 1, 1}; // 5 根筷子的空闲状态
Philosopher_i() {
while (1) {
think();
P(limit);
P(chopstick[i]);
P(chopstick[(i + 1) % 5]);
V(limit);
eat();
V(chopstick[(i + 1) % 5]);
V(chopstick[i]);
}
}
This post is licensed under
CC BY 4.0
by the author.