2012-10-21 49 views
0

你好,我已经通过dining philosophers的解决方案了。由于在某个时间点,典型的监视器实现会导致饥饿。我已经通过给here饥饿在用餐哲学家的解决方案

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)正在检查其左右哲学家是否饥饿。如果它发现它的邻居也饿了。这是一种僵局吗?我的意思是他们两个都不能吃,因为他们的邻居哲学家饿了吧?

谢谢

回答

0

你是对的。如果两个相邻的哲学家在对方的眼睛,即饿了会发生死锁。 leftHungry[0] == TRUE && rightHungry[1] == TRUE

然而,可能永远不会发生这种状态,因为leftHungry[x]rightHungry[x]设置为TRUE唯一的一次是当x电话putDown(),它总是由x的号召先于pickUp(),这台leftHungry[x]rightHungry[x]FALSE

例如:philosopher0leftHungry[0] == TRUE和他们的状态是HUNGRYphilosopher1电话pickUp()和他们的状态是那么HUNGRY了。即使philosopher1必须等待,(因为philosopher2EATING),philosopher0leftHungry[0] == FALSE,防止任何相邻的哲学家同时认为互相饥饿。