如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
问题描述(1)只有拿到两只叉子时,哲学家才能吃饭。(2)如果叉子已被别人拿走,则必须等别人吃完之后才能拿到叉子。怎样才能保证哲学家不被饿死呢?摘要:解决“哲学家进餐”问题首先要找出对应的控制关系,设定相应的控制信号量。避免死锁也是解决该类问题的关键。关键词:进程同步;信号量;临界资源;临界区;死锁算法A算法分析:算法改善:改进后的算法A算法B思想semaphorefork[5]={1,1,1,1,1};voidphilosopher(inti){while(true){think();if(i%2==0)//偶数哲学家,先右后左。{wait(fork[i+1]mod5);wait(fork[i]);eat();signal(fork[i+1]mod5);signal(fork[i]);}Else//奇数哲学家,先左后右。{wait(fork[i]);wait(fork[i+1]mod5);eat();signal(fork[i]);signal(fork[i+1]mod5);}}算法C思想:方法1semaphorefork[5]={1,1,1,1,1};voidphilosopher(intI){while(true){think();Swait(fork[(I+1)]%5,fork[I]);eat();Ssignal(fork[(I+1)]%5,fork[I]);}}方法2semaphoremutex=1;semaphorefork[5]={1,1,1,1,1};voidphilosopher(intI){while(true){think();wait(mutex);wait(fork[(I+1)]%5);wait(fork[I]);signal(mutex);eat();signal(fork[(I+1)]%5);signal(fork[I]);}}算法D思想:Test()函数的作用声明:以下为代码:voidtest(inti){if(state[i]==HUNGRY&&state[LEFT(i)]!=EATING&&state[RIGHT(i)]!=EATING){state[i]=EATING;V(s[i]);}}voidput_forks(inti){P(mutex);state[i]=THINKING;test(LEFT(i));/*看左邻是否进餐*/test(RIGHT(i));/*看右邻是否进餐*/V(mutex);}}综上所述,解决这一类问题的关键是找出对应的控制关系,设定相应的控制信号量。另外,产生死锁是在用信号量进行流程控制过程中常会遇到的一个问题,因此如何避免死锁就是解决该类问题的关键。Thankyou!