家吃饭请求,其初值均为1。注意:对第I个哲学家来说,他的两个邻座分别为I1mod5和I4mod5,第I个哲学家的左右邻座定位如图所示。此外,5支筷子也为临界资源,即chopstick0chopstick4初值为1。由于禁止两相邻的哲学家同时申请,因此也就不存在同时竞争请求筷子的问题。(但可能申请的筷子正在别的哲学家手上),故可以去掉公用信号量mutex,相应的同步算法如下:begi
s0s1s2s3s41chopstick0chopstick1chopstick2chopstick3chopstick41
fcobegi
PiI01234Begi
RepeatPsI第I个哲学家提出吃饭请求PsI1mod5禁止左邻哲学家提出申请;如果左邻哲学家已经提出申请,则阻塞哲学家I的此次请求PsI4mod5禁止右邻哲学家提出申请;如果右邻哲学家已提出申请,则阻塞哲学家I的此次申请PchopstickIPchopstickI1mod5VsI哲学家I的申请结束VsI1mod5取消哲学家I的左邻哲学家申请的禁止VsI4mod5取消对右邻哲学家申请的禁止EatVchopstickIVchopstickI1mod5Thi
kU
tilfalseE
dCoe
dE
d2为了保证没有两个邻座同时吃饭,特设置变量r0r4z来记录哲学家的吃饭情况。此外,设置信号量s0~s4来控制0~4号哲学家的吃饭过程,其初值为0。由于不存在两邻座同时吃饭,因此,筷子已不是临界资源。相应的同步算法如下:begi
mutex1r0r1r2r3r40s0s1s2s3s40cobegi
PiI01234repeatPmutexIfrI1mod51orrI4mod51the
如果第I个哲学家左右邻桌有一人以上正在就餐,则阻止此次申请begi
Vmutex在阻塞自己之前,先释放公用信号量以便其它进程进入PsIE
dElseBegi
RI1Vmuetex
fE
dEatPmutexRI0清除给自己设置的吃饭标志IfrI3mod5=0a
dsI4mod51the
VsI4mod5第I个哲学家右邻(即(I+4)mod5)已提出过申请(即sI4mod51)并在其右邻(即sI3mod5)没有进餐的情况下,解除对申请的阻塞ifrI2mod50a
dSI1mod51the
VsI1mod5第I个哲学家左邻(即I1mod5)已提出过申请(即sI1mod51)并在其左邻(即I2mod5)没有就餐的情况下,解除对申请的阻塞thi
ku
tilfalsee
dcoe
de
d35个哲学家吃不上饭的例子如上所示。
1
fr