【问题标题】:Starvation in dining philosopher's solution用餐哲学家的解决方案中的饥饿
【发布时间】:2012-10-11 08:27:49
【问题描述】:

我已经通过dining philosophers 解决方案。因为在某个时间点,典型的监视器实现会导致饥饿。我已经解决了herehere的餐饮哲学家问题的“礼貌”版本

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;
   }    

}

如果两个相邻的哲学家同时饿了怎么办。因为 test(i) 正在检查它的左右哲学家是否饿了。如果它发现它的相邻的也饿了。这是一种僵局吧?我的意思是他们两个都不能吃,因为他们相邻的哲学家都饿了,对吧?

【问题讨论】:

    标签: operating-system semaphore monitor


    【解决方案1】:

    你是对的。如果两个相邻的哲学家在彼此的眼中感到饥饿,就会发生死锁,即。 leftHungry[0] == TRUE &amp;&amp; rightHungry[1] == TRUE.

    然而,这种状态永远不会发生,因为leftHungry[x]rightHungry[x] 设置为TRUE 的唯一时间是x 调用putDown(),它总是以@ 开头987654327@ 对pickUp() 的调用,将leftHungry[x]rightHungry[x] 设置为FALSE

    例如: philosopher0leftHungry[0] == TRUE,它们的状态是HUNGRYphilosopher1 调用pickUp(),它们的状态也是HUNGRY。即使philosopher1 必须等待,(因为philosopher2EATING),philosopher0 设置leftHungry[0] == FALSE,防止任何相邻的哲学家同时思考彼此饿了。

    【讨论】:

      猜你喜欢
      • 2019-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      • 2016-03-04
      相关资源
      最近更新 更多