原文内容来自免费考研论坛,请点击查看全文
http://bbs.freekaoyan.com/viewthread.php?tid=331014
在看哲学家就餐的问题,然后自己综合网上的一些内容写了部分伪代码, 希望大家过来看看讨论一下,错误的地方请指正
哲学家就餐问题
防止饿死出现
算法1: 一次性只准4个哲学家就餐,设置信号量number当第五个哲学家想就餐时,进入等待队列
semaphore number=4;
semaphore chopstic[5]={1,1,1,1,1};
void pilosopher(i) //第i个哲学家活动的代码,每个哲学家都从自己的左手边筷子开始,然后拿右手的筷子 i从0开始
{
while(1)
{
thinking;
wait(number);
wait(chopstic);
wait(chopstic[(i 1)%5];
eatting;
signal(number);
signal(chopstic[(i 1)%5];
signal(chopstic;
signal(number);
thinking;
}
}
算法2: 只有当哲学家确定了左右的筷子都可以用的时候才真的拿起筷子 将拿起筷子看成是一个原子操作
semaphore chopstic[5]={1,1,1,1,1,};
semaphore mutex=1;
void pilosopher(i)
{
while(1)
{
thinking;
wait (mutex);
wait (chopstic);
wait (chopstic[(i 1)%5]);
signal(mutex);
eating;
signal (chopstic[(i 1)%5]);
signal (chopstic);
thinking;
}
}
算法3: 规定奇数号的哲学家先拿起他左边的筷子,然后再去拿他右边的筷子;而偶数号
的哲学家则相反.
semaphore chopstick[5]={1,1,1,1,1};
void philosopher(int i)
{
while(1)
{
think();
if(i%2 == 0) //第奇数个哲学家,先左后右。
{
wait (chopstick) ;
wait (chopstick[(i 1)mod 5]) ;
eat();
signal (chopstick[(i 1)mod 5]) ;
signal (chopstick) ;
}
Else //第偶数哲学家,先右后左。
{
wait (chopstick[(i 1)mod 5]) ;
wait (chopstick);
eat();
signal (chopstick) ;
signal (chopstick[ i 1 ] mod 5) ;
}
}
关于哲学家就餐问题的几段代码
Heavyliu 免费考研论坛/2008-10-31
相关话题/
领限时大额优惠券,享本站正版考研考试资料!
优惠券领取后72小时内有效,10万种最新考研考试考证类电子打印资料任你选。涵盖全国500余所院校考研专业课、200多种职业资格考试、1100多种经典教材,产品类型包含电子书、题库、全套资料以及视频,无论您是考研复习、考证刷题,还是考前冲刺等,不同类型的产品可满足您学习上的不同需求。 ...考试优惠券 本站小编 Free壹佰分学习网 2022-09-19
Free考研考试FreeKaoYan.Com
欢迎来到Free考研考试,"为实现人生的Free而奋斗"
© 2020 FreeKaoYan! . All rights reserved.