问答题 8位哲学家围坐一方桌,桌子每边坐2位,每位哲学家面前放一盘面条,桌子四角和每一边(中间)各放着一把叉子。哲学家只进行两种活动:吃饭和思考问题。当一位哲学家感到饥饿时,先取自己边上的叉子,拿到之后,再取自己角上的叉子,两把叉子到手才能用餐,吃完后把两把叉子放回原处。写一段程序描述哲学家的行为,并讨论这种安排是否可能导致死锁。
【正确答案】
【答案解析】对8位哲学家顺序编号为:P 1 ,P 2 ,P 3 ,P 4 ,P 5 ,P 6 ,P 7 ,P 8 ,对8个叉子顺序编号为:1,2,3,4,5,6,7,8。讨论每个哲学家的行为过程,再总结出规律,发现下标为奇数的哲学家是先拿左边的叉子,再拿右边的叉子;下标为偶数的哲学家先拿右边的叉子,再拿左边的叉子。由此得到以下程序,信号量S[i]的初值均为1。又因为编号P 8 的哲学家拿起的是8号和1号叉子,因此用取余运算令其返回1。
if(i%2==0) {
P(S[i]);
P(S[(i+1)%8]);
吃;
V(S[i]);
V(S[(i+1)%8]);
}
else {
P(S[i+1]);
P(S[i]);
吃;
V(S[i+1]);
V(S[i]);
}
该题不可能死锁。死锁产生的条件是所有的哲学家都从同一边拿起叉子,导致每个进程占用一个资源(叉子)而等待另一个资源,但该题的取叉子方式避免了这一现象。