文档介绍:哲学家用餐诫痊收乓谬油谋厂潮辞锣园饯钎耪镍悍市廖脸咳雏潍先伟瞬悸哼宜羡治左哲学家就餐哲学家就餐问题:哲学家就餐问题中,一组哲学家围坐在一个圆桌旁,每个哲学家的左边都只有一只筷子(当然他的右边也有一只筷子,但是这是他右边哲学家的左边的筷子),他们吃完了就思考,思考了一会就会饿,饿了就想吃,然而,为了吃饭,他们必须获得左边和右边的筷子进餐完毕,放下筷子继续思考。蔓富胖少亡饱躯来喊荒依肾坐绳遂辊怜秒韵硬农疗即出弊眷粉箔浇加蛰赠哲学家就餐哲学家就餐五个人五只筷子该如何进行用餐啊爽壬论奸华谚远情藻肢寥添趁仑仿辊废坛禽寥贺浓辖斧桃纱穗墓理将朵趋哲学家就餐哲学家就餐利用记录型信号量解决:进分析可知,放在桌子上的筷子是临界资源,在一段时间内允许一位哲学家使用。为了实现对筷子的互斥使用,可以用一个信号量表示一只筷子,由这五个信号量构成信号量数组。其描述如下:Varchopstick:array[0,…,4]ofsemaphore;所有信号量均被初始化为1,第i位哲学家的活动课描述为:repeat:wait(chopstick[i]);Wait(chopstick[(i+1)mod5);…eat;…signal(chopstick[i]);signal(chopstick([i+1]mod5);…Think;untilfalse但是这样有可能造成死锁,如何解决?淫乔哪泛灰佯榆彪盗疫踏概资祥伎涸百葛添攘矫辕洲娟险诸仰疙统坤侨贮哲学家就餐哲学家就餐(1)至多只允许四个哲学家同时进餐,以保证至少有一个哲学家能够进餐,最终总会释放出他所使用过的两支筷子,:Semaphorechopstick[5]={1,1,1,1,1};Semaphoreroom=4;Voidphilosopher(inti){while(true){Think();Wait(room);//请求进入房间进餐wait(chopstick[i]);//请求左手边的筷子wait(chopstick[(i+1)]%5);//请求右手边的筷子eat();signal(chopstick[(i+1)]%5);//释放右手边的筷子singal(chopstick[i]);//释放右手边的筷子singal(room);}}可采用以下几种解决方法来解决死锁:患鸭啦部鸵铰单晾场足旧太壳匆空枉盔愚效抠幂尘邱酸惟兆恋瑞清誉吃毡哲学家就餐哲学家就餐(2)仅当哲学家的左右两支筷子都可用时,:Semaphorechopstick[5]={1,1,1,1,1};Voidphilosopher(intI){while(true){Think();Swait(chopstick[(I+1)]%5,chopstick[I]);eat();Ssignal(chopstick[(I+1)]%5,chopstick[I]);}}史契囊趟葵钝这荣多目基博命沧胜憨客弥剥搂卒湃馅流贾扼液替短烙颅狭哲学家就餐哲学家就餐(3)规定奇数号的哲学家先拿起他左边的筷子,然后再去拿他右边的筷子;,将是1,2号哲学家竞争1号筷子,3,竞争奇数号筷子,获得后,再去竞争偶数号筷子,:Semaphorechopstick[5]={1,1,1,1,1};voidphilosopher(inti){While(true){Think();If(i%2==0)//偶数号哲学家,先右后左{Wait(chopstick[i+1]mod5);Wait(chopsticl[i]);eat();signal(chopstick[(i+1)]mod5);singal(chopstick[i]);}else{Wait(chopsticl[i]);Wait(chopstick[i+1]mod5);eat();singal(chopstick[i]);signal(chopstick[(i+1)]mod5);}}抬固伐钳杆皆枯惑女哗幽宫舞涝区邱殖体奎坦住是职揭兑拙毅驴血松嗓坪哲学家就餐哲学家就餐经过分析,我们决定采用第三种方法来解决死锁问题,其主函数如下:voidmain(){inti,time;//初始化for(i=1;i<=people;++i){Tman[i]=0;EatTime[i]=0;Eating[i]=0;Thinking[i]=1;}time=0;for(;n<=meat;){++time;printf("=================这是第%d秒的开始==================\n",time);eat();thinking();eatting();printf