2014-10-12 108 views
1

我的學校實施了Peterson的解決方案。我有一些關於它的問題。 您可以在最後找到整個代碼。Peterson解決方案的實施無法正常工作

Firsly;這兩個線程(AddOne和SubOne)是否正確地進入和離開具有相同過程值「0」的關鍵區域。

PetersonsSolution.enter_region(0); //Both use 0 as paramater. 

代碼的輸出是這樣的:

++ finihed 
-- finished 
Result: 0 
++ finihed 
-- finished 
Result: -49 
-- finished 
++ finihed 
Result: -64 
++ finihed 
-- finished 
Result: -54 
...ans so on 

我想,如果彼得森的解決方案的工作如預期的結果必須等於0。但他們都是不同的。

所以我改變類AddOne像這樣:給一個不同的參數。

class AddOne extends Thread { 

    @Override 
    public void run() { 
     for (int i = 0; i < 1000; i++) { 

      PetersonsSolution.enter_region(1); //give 1 as paramater. 
      PetersonsSolution.myValue++; 
      PetersonsSolution.leave_region(1); //give 1 as paramater. 

     } 
     System.out.println("++ finihed"); 
    } 

} 

這給我結果我預期:

-- finished 
++ finihed 
Result: 0 
++ finihed 
-- finished 
Result: 0 

但是這一次,後一兩秒鐘的程序進入無限循環和打印無關的屏幕。我認爲它卡在這while(turn == process && interested[other])

我的問題是;

  1. 給出不同的工藝參數以獲得 預期結果(結果:0)是否正確?
  2. 如果這是正確的,爲什麼它卡住一段時間後?

謝謝大家!

彼得森的解決方案實施:

public class PetersonsSolution { 

    static int myValue = 0; 
    static int turn; 
    static boolean interested[] = {false, false}; 

    public static void main(String[] args) throws Exception { 
     while (true) { 

      AddOne add = new AddOne(); 
      SubOne sub = new SubOne(); 

      add.start(); 
      sub.start(); 

      add.join(); 
      sub.join(); 

      System.out.println("Result: " + myValue); 
     } 
    } 

    public static void enter_region(int process){ 
     int other; 
     other = 1 - process; 
     interested[process] = true; 
     turn = process; 

     while(turn == process && interested[other]){ 
      //System.out.println("waiting"); 
     } 
    } 

    public static void leave_region(int process){ 
     interested[process] = false; 
    } 

} 

class AddOne extends Thread { 

    @Override 
    public void run() { 
     for (int i = 0; i < 1000; i++) { 

      PetersonsSolution.enter_region(0); 
      PetersonsSolution.myValue++; 
      PetersonsSolution.leave_region(0); 

     } 
     System.out.println("++ finihed"); 
    } 

} 

class SubOne extends Thread { 
    @Override 
    public void run() { 
     for (int i = 0; i < 1000; i++) { 

      PetersonsSolution.enter_region(0); 
      PetersonsSolution.myValue--; 
      PetersonsSolution.leave_region(0); 

     } 
     System.out.println("-- finished"); 
    } 
} 
+0

您在代碼中共享數據,但不使用任何同步。這看起來不太好。 – kraskevich 2014-10-12 13:59:01

+0

http://stackoverflow.com/questions/2911915/peterson-algorithm-in-java – 2014-10-12 14:00:58

回答

相關問題