哲学家进餐问题.ppt
上传人:天马****23 上传时间:2024-09-11 格式:PPT 页数:22 大小:234KB 金币:10 举报 版权申诉
预览加载中,请您耐心等待几秒...

哲学家进餐问题.ppt

哲学家进餐问题.ppt

预览

免费试读已结束,剩余 12 页请下载文档后查看

10 金币

下载此文档

如果您无法下载资料,请参考说明:

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!