哲学家进餐问题的死锁问题

如题所述

第1个回答  2016-06-02

(1)破坏请求保持条件
利用原子思想完成。即只有拿起两支筷子的哲学家才可以进餐,否则,一支筷子也不拿。
解法一:利用AND机制实现第1位哲学家的活动描述为:
philosopher (int I)
{
while(true)
{
思考;
swait(chopstick[(I+1)]%5,chopstick[I]);
进餐;
Ssignal(chopstick[I],chopstick[(I+i)%5]);
}
}
解法二:利用记录型信号量机制实现在初始化中增加一个信号量定义:semaphore mutex=1:
第1位哲学家的活动描述:
philosopher (int I)  {
while(true)
{
思考;
wait(mutex);
wait(stiCk[I]);
wait(Stick[(I+1)%5]);
Signal(mutex);
进餐;
signal(stick[I]);
Signal(Stick[(I+1)%5]);  }  }
该方法将拿两只筷子的过程作为临界资源,一次只允许一个哲学家进入。
(2)破坏环路等待条件
在上述死锁问题中,哲学家对筷子资源的申请构成了有向环路,如图2所示。  
图2环路等待
解法一:奇数号哲学家先拿他左边的筷子,偶数号哲学家先拿他右边的筷子。这样破坏了同方向环路,一个哲学家拿到一只筷子后,就阻止了他邻座的一个哲学家吃饭。按此规定,将是1、2号哲学家竞争I号筷子;3、4号哲学家竞争4号筷子。两种算法描述如下:
1)第1个哲学家的活动:
philosopher (int I)
{
while(true)
{
思考;
If I%2==1 then
wait(Stick[I]);
wait(stick[(I+1)%5]);
进餐;
Signal(stick[I J);
signal(stick[(I+1)%5]);
e1Se
wait(stick[(I+1)%5]);
wait(stick[I]);
进餐;
signal(stick[(I+1)%5]);
Signal(stick[I]);
}  }
(2)第1个哲学家的活动:
philosopher(int I)
{
while(true)
{
思考;
wait(chopstick[I+(I%2)];
wait(chopstick[(I+(I+1)%2)%5])
进餐;
signal(chopstick[I+(I%2)]);
Signal(chopstick[(I+(I+1)%2)%5]);  }  }
解法二:至多允许四位哲学家进餐,将最后一个哲学家停止申请资源,断开环路。最终能保证有一位哲学家能进餐,用完释放两只筷子,从而使更多的哲学家能够进餐。增加一个信号量定义semaphore count=4:算法描述第1个哲学家的活动:
philosopher (int I)
{
while(true)
思考;
wait(count);
wait(chopstiok[I]);
wait(chopstick[I+1]mod 5);
进餐;
signal(chopstick[I]);
signal(chopstick[I+1]mod 5)
signal(count);
}
}
解法三:哲学家申请资源总是按照资源序号先大后小的顺序,这样0.3号哲学家先右后左,但是4号哲学家
先左后右,改变方向,破坏了环路。算法描述第1个哲学家的活动:
philosopher(int I)
{
while(true)
{
思考;
if I>(I+1)%5 then
wait(chopstick[I]);
wait(chopstick[I+1]mod 5);
else
wait(chopstick[T+1]mod 5);
wait(chopstick[T]);/*哲学家总是先取最
大序号的筷子*/
进餐;
signal(chopstick[I]);
signal(chopstick[I+1]mod5);
}  }

相似回答