您现在的位置: 中国IT实验室 >> 软件水平考试 >> 考试技巧 >> 文章正文
哲学家就餐问题

ChinaITLab.com  2003-10-11  保存本文  推荐给好友  QQ上看本站  收藏本站



  有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空盘子,每两人之间放一只筷子每个哲学家的行为是思考,感到饥饿,然后吃通心粉.为了吃通心粉,每个哲学家必须拿到两只筷子,并且每个人只能直接从自己的左边或右边去取筷子
  #define N 5
   void philosopher (int i)
  {
   while (true)
   {
   思考;
   取fork[i]; 取fork[(i+1) % 5];
   进食;
   放fork[i]; 放fork[(i+1) % 5];
   }
  }
  为防止死锁发生可采取的措施:
  最多允许4个哲学家同时坐在桌子周围仅当一个哲学家左右两边的筷子都可用时,才允许他拿筷子()给所有哲学家编号,奇数号的哲学家必须首先拿左边的筷子,偶数号的哲学家则反之 为了避免死锁,把哲学家分为三种状态,思考,饥饿,进食,并且一次拿到两只筷子,否则不拿.
  
   
  
  哲学家就餐问题解法(1)
  #define N 5
   void philosopher (int i)
  {
   while (true)
   {
   思考;
   取fork[i]; 取fork[(i+1) % 5];
   进食;
   放fork[i]; 放fork[(i+1) % 5];
   }
  }
  哲学家就餐问题解法(2)
  #define N 5
  #define THINKING 0
  #define HUNGRY 1
  #define EATING 2
  #typedef int semaphore;
  int state[N];
  semaphore mutex=1;
  semaphore s[N];
  void test(int i)
  {
   if (state[ i ] == HUNGRY)
   && (state [ (i-1) % 5] != EATING)
   && (state [ (i+1) % 5] != EATING)
   {
   state[ i ] = EATING;
   V(&s[ i ]);
   }
   }
  void philosopher (int i)
  { while (true)
   {
   思考;
   P(&mutex);
   state[i] = HUNGRY;
   test(i);
   V(&mutex);
   P(&s[i]);
   拿左筷子;
   拿右筷子;
   进食;
   放左筷子;
   放右筷子;
   P(&mutex)
   state[ i ] = THINKING;
   test([i-1] % 5);
   test([i+1] % 5);
   V(&mutex);
   }
  }
  state[ i ] = THINKING
  s[ i ] = 0
  
  
  
  




 相关文章  热门文章
系统分析师论文"论建立企业INTRANET的策略"
计算机软件水平考试:《数据结构》是核心
系统分析员考试备考要略
系统分析员备考之经济管理篇(二)
系统分析员备考之经济管理篇(一)
软件设计师复习--检错码CRC
关于高程下午试题的一些预测与解题方法
程序高手必读:写好C程序的10条秘籍
数据结构学习(C++)——二叉树 
1990-2000年事务处理流程图和数据流图试题分…

 文章评论


认证培训
热门专题       more
相关下载
论坛新帖
博 客