在看哲学家就餐的问题,然后自己综合网上的一些内容写了部分伪代码, 希望大家过来看看讨论一下,错误的地方请指正
哲学家就餐问题
防止饿死出现
算法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) ;
}
} |