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])
我的問題是;
- 給出不同的工藝參數以獲得 預期結果(結果:0)是否正確?
- 如果這是正確的,爲什麼它卡住一段時間後?
謝謝大家!
彼得森的解決方案實施:
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");
}
}
您在代碼中共享數據,但不使用任何同步。這看起來不太好。 – kraskevich 2014-10-12 13:59:01
http://stackoverflow.com/questions/2911915/peterson-algorithm-in-java – 2014-10-12 14:00:58