哲学家进餐问题

问题描述

image.png

问题分析

互斥关系:一个筷子只能被一个哲学家拿。

代码实现

注意到如果所有哲学家都举起左手,那么就会导致死锁,并且产生循环等待。所以,我们需要一种策略打破这种僵局:

  1. 让最后一个哲学家举起右手;
  2. 只让四个哲学家上桌吃饭,即将桌子看做一个缓冲区;
  3. 让哲学家同时拿左右手的筷子;

第三种情况演示:

sem chopstick[5] = {1, 1, 1, 1, 1};
sem mutex = 1;

P(int i) {
	while (1) {
		P(mutex);
		P(chopstick[i]);
		P(chopstick[(i + 1) % 5]);
		V(mutex);
		... 吃饭
		V(chopstick[i]);
		V(chopstick[(i + 1) % 5]);
	}
}

第二种情况:

sem chopstick[5] = {1, 1, 1, 1, 1};
sem mutex = 1;

P(int i) {
	while (1) {
		if (i != 4) { 
			P(chopstick[i]);
			P(chopstick[(i + 1) % 5]);
		} else { 
			// 最后一个哲学家先拿右手
			P(chopstick[(i + 1) % 5]);
			P(chopstick[i]);
		}
		... 吃饭
		V(chopstick[i]);
		V(chopstick[(i + 1) % 5]);
	}
}