当前位置: 首页 > 知识库问答 >
问题:

进餐中的饥饿哲学家的解决方案

葛嘉悦
2023-03-14

我已经完成了解决方案。因为在某个时间点,典型的监视器实现会导致饥饿。我已经阅读了这里给出的用餐哲学家问题的“礼貌”版本

monitor diningPhilosophers {
   int[] state = new int[5];
   boolean[] leftHungry = new boolean[5];
   boolean[] rightHungry = new boolean[5];
   static final int THINKING = 0;
   static final int HUNGRY = 1;
   static final int EATING = 2;
   condition[] self = new condition[5];

   public diningPhilosophers {
      for (int i=0;i<5;i++) {
         state[i] = THINKING;
         leftHungry[i] = false;
         rightHungry[i] = false;
      }  
   }   

   public entry pickUp(int i) {
      state[i] = HUNGRY;
      test(i);
      if (state[i] != EATING)
         self[i].wait;
      rightHungry(left(i)) = false;
      leftHungry(right(i)) = false;
   }

   ublic entry putDown(int i) {
      state[i] = THINKING;
      test(left(i));
      if (state[left(i)] == HUNGRY)
         leftHungry[i] = true;
      test(right(i));
      if (state[right(i)] == HUNGRY)
         rightHungry[i] = true;
   }

   private test(int i) {
      if  (state[right(i] != EATING) &&
          (state[i] == HUNGRY) &&
          (state[left(i)] != EATING) &&
             !leftHungry(i) && !rightHungry(i) ) {
             state[i] = EATING;
             self[i].signal;
          }
   }

   private int left(int i) {
      return (i+1)%5;
   }    

   private int right(int i) {
      return (i+4)%5;
   }    

}

那么,如果两个相邻的哲学家同时感到饥饿呢。因为测试(i)是检查它的左派和右派哲学家是否饿了。如果它发现它的邻居也饿了。这是一种僵局,对吗?我的意思是他们两个都不能吃东西,因为他们附近的哲学家家饿了,对吧?

共有1个答案

罗新
2023-03-14

你说得对。如果两个相邻的哲学家在对方眼里都饿了,就会出现死锁,即lefthunging[0]==TRUE

但是,这种状态永远不会发生,因为只有当x调用putton()时,lefthunger[x]rightunger[x]才会被设置为TRUE,而x调用pickUp()之前总是有x的调用,它将左饥饿[x]右饥饿[x]设置为FALSE

例如:哲学家0具有leftHungring[0]==TRUE并且它们的状态是HUNGRY,并且哲学家1调用picUp()并且它们的状态也是HUNGRY。即使必须等待,(因为哲学家2),哲学家0设置左饥饿[0]==FALSE,防止任何相邻的哲学家同时认为对方饿了。

 类似资料:
  • 这是Geeksforgeeks使用信号量解决用餐哲学家问题的方法: https://www.geeksforgeeks.org/dining-philosopher-problem-using-semaphores/ 这个代码死锁活锁和饥饿的概率很低,我想改变它,它将有死锁,活锁或饥饿的概率很高,我怎么做? 此外,我如何确保这个解决方案不会有任何这些问题100%(如果可能的话)

  • 根据这篇维基百科文章中的钱迪/米斯拉部分,我们有5位哲学家,编号为P1-P5。 根据这句话: 对于每一对争夺资源的哲学家,创建一个叉子,并将其交给具有较低ID的哲学家(n代表代理Pn)。每个叉子可以是脏的或干净的。最初所有的叉子都是脏的 当一个有叉子的哲学家收到一个请求消息时,如果叉子是干净的,他会保留它,但是如果叉子是脏的,他会放弃它。如果他把叉子送过去,他会先把叉子清理干净。 因此,如果知道所

  • 哲学家晚餐问题的指挥解决方案建议使用四码的信号,所有哲学家都试图在右叉之前得到左叉。http://en.wikipedia.org/wiki/Dining_philosophers_problem#Conductor_solution 信号量应该用于访问左fork和访问右fork的每个人吗? 如果一个哲学家能在规定的时间内得到左叉子,但没有得到右叉子,他该怎么办?他们应该把左叉子还给我吗? 哲学家

  • 本文向大家介绍餐饮哲学家问题(DPP),包括了餐饮哲学家问题(DPP)的使用技巧和注意事项,需要的朋友参考一下 餐饮哲学家的问题指出,有5位哲学家共享一张圆桌,他们交替吃饭和思考。每个哲学家都有一碗饭和5根筷子。哲学家需要左右筷子才能吃饭。饿了的哲学家只有在两把筷子都齐备的情况下才可以吃东西,否则哲学家放下筷子,重新开始思考。 餐饮哲学家是一个经典的同步问题,因为它演示了一大类并发控制问题。 餐饮

  • 今天,我决定尝试解决哲学家吃饭的问题。所以我写下面的代码。但我认为这是不正确的,所以如果有人告诉我这是怎么回事,我会很高兴的。我使用fork作为锁(我只读取它们,因为我不把对它们的访问放在同步块中),我有一个扩展线程的类,它保留了它的两个锁。 我认为有些不对劲,因为第五位哲学家从不吃饭,第四位和第三位哲学家大多吃饭。提前感谢。

  • 我的Java代码中有一个问题,它应该模拟pholosophers问题,如下所述:http://en.wikipedia.org/wiki/Dining_philosophers_problem我想输出所有哲学家的当前状态,每次他们中的一个吃饭或思考。输出应该是这样的:“OxOx(2)”,其中“X”表示哲学家在吃,“O”表示他在思考,“O”表示他在等筷子。括号中的数字表示状态已更改的哲学家的编号。我