XHotSniperX
Lt. Junior Grade
- Registriert
- Jan. 2008
- Beiträge
- 474
Hallo
ich versuche gerade die Nebenläufigkeit in parallelen Programmen zu verstehen. Mitunter ist das Problem der Speisenden Philosophen. Ich habe ein Programm geschrieben in Java, welches dieses Problem simulieren soll.
Es sind die Klassen DiningPhil(main), Fork und Philosopher. In der Klasse Fork(Gabel) ist Semaphore drin.
Das wichtige werde ich hier posten:
DiningPhil
Fork
Philosopher
Das Problem ist jetzt, dass beim ausführen direkt alle Philosophen HUNGRIG sind und bleiben für immer. Jedes Mal. Wieso habe ich immer einen Deadlock? Die Müssten doch zu erst ne random Zeit DENKEN und dann erst HUNGRIG werden und ESSEN wollen.
Die Random Zeit liegt zwischen 1 und 10 Sekunden.
Habt ihr ne Idee woran das liegt?
ich versuche gerade die Nebenläufigkeit in parallelen Programmen zu verstehen. Mitunter ist das Problem der Speisenden Philosophen. Ich habe ein Programm geschrieben in Java, welches dieses Problem simulieren soll.
Es sind die Klassen DiningPhil(main), Fork und Philosopher. In der Klasse Fork(Gabel) ist Semaphore drin.
Das wichtige werde ich hier posten:
DiningPhil
Code:
...
for (int i=0; i<NUM_PHILS; i++){
forks[i]= new Fork();
}
for (int i=0; i<NUM_PHILS; i++){ // jeder Philosoph hat Zugriff auf 2 Gabeln
phils[i]= new Philosopher(i, forks[i], forks[(i+1)%NUM_PHILS]);
}
for (int i=0; i<NUM_PHILS; i++){ // Philosophen beginnen zu wirken
phils[i].start();
}
}
...
Fork
Code:
class Fork{
private final Semaphore sem = new Semaphore(1);
public void take(){
try{
sem.acquire();
}
catch(InterruptedException e){
e.printStackTrace();
}
}
public void putBack(){
sem.release();
}
}
Philosopher
Code:
class Philosopher extends Thread{
...
private void thinking(){
state = 0;
waitRandomTime();
}
private void hungry(){
state = 1;
left.take();
right.take();
}
private void eating(){
state = 2;
waitRandomTime();
left.putBack();
right.putBack();
}
public void run(){
while(!gone){
thinking();
hungry();
eating();
}
}
...
}
Das Problem ist jetzt, dass beim ausführen direkt alle Philosophen HUNGRIG sind und bleiben für immer. Jedes Mal. Wieso habe ich immer einen Deadlock? Die Müssten doch zu erst ne random Zeit DENKEN und dann erst HUNGRIG werden und ESSEN wollen.
Die Random Zeit liegt zwischen 1 und 10 Sekunden.
Habt ihr ne Idee woran das liegt?
Zuletzt bearbeitet: