Free考研资料 - 免费考研论坛

 找回密码
 注册
打印 上一主题 下一主题

关于哲学家就餐问题的几段代码

[复制链接]
跳转到指定楼层
楼主
Heavyliu 发表于 08-10-31 00:14:55 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
在看哲学家就餐的问题,然后自己综合网上的一些内容写了部分伪代码,  希望大家过来看看讨论一下,错误的地方请指正

哲学家就餐问题
防止饿死出现

算法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) ;
}
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系我们|Free考研资料 ( 苏ICP备05011575号 )

GMT+8, 24-12-29 19:44 , Processed in 0.337276 second(s), 12 queries , Gzip On, Xcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表