文档介绍:关于哲学家的进餐问题
计科41 李雪 1924114
该吃午饭了?
P[4]
P[3]
P[2]
P[1]
P[0]
第一阶段:具体化分析
哲学家
左手
右手
P[0]
C[0]
C[4]
P[1]
C[1]
C[0]
P[2]
C[2]
C[1]
P[3]
C[3]
C[2]
P[4]
C[4]
C[3]
C[1]
C[4]
C[2]
C[3]
C[0]
从分析可以看出:哲学家P[n]在同时获得左手的筷子C[n]和右手的筷子
C[(n+4)mod5]后才能进餐.
PV信号量对问题的描述
(先设定每个哲学家都从左手开始拿筷子)
Var C[0,1……4]of semaphore:=(1,1,1,1,1);
//其中调度P[0,1……4]这组进程
P[n]:begin:
wait(C[n]);
C[n]=C[n]-1;
wait(C[(n+4)mod5]);
C[n]=C[(n+4)mod5]-1;
进餐;
signal(C[n]);
C[n]=C[n]+1;
signal(C[(n+4)mod5]);
C[n]=C[(n+4)mod5]+1;
思考;
end
可以看出PV信号量对问题的描述的确简单,但是如果五个人同时都拿起了左手的筷子又该如何呢??
让加菲用另外一种方法来再
给你描述下吧
管程方式
“为了解决5个人同时拿起筷子的死锁问题,加菲特别设置了一个变量counter来记录进程进入的个数和一个条件变量nolock来定义不会造成死锁的条件。
另外,它还把哲学家进餐问题看成为3个过程即:
左手拿起筷子
右手拿起筷子
双手放下筷子
实现过程:
tpye philosopher-dinning=monitor
Var counter:integer;
nonright[0,1……4],nonlock:condition;
begin counter:=0;nonlock=0;nonright[]=1,1,1,1,1end
其中的nonright的设置是因为