Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
Aufgabe 5.5
Ich wollte mal fragen, wie die Ausgabe der Philosophen-aufgabe aussehen sollte bzw woran man sich orientieren kann, dass das Programm richtig läuft?
Bei Teilaufgabe b) - d) gibt keinen Deadlock, d.h. das Programm hängt sich nicht auf und es kommen immer mal wieder alle Philosophen zum Essen ;).
Am Ende ist aber das Auftreten eines Deadlocks vom Timing abhängig und es ist nicht sicher gestellt,
dass falscher Code auch eine falsche Ausgabe erzeugt.
Aber in Teilaufgabe a) soll schon ein Deadlock passieren? Es heißt ja früher oder später in der Aufgabe…
Ja genau. DIe Teilaufgabe soll so gebaut sein, das theoretisch ein Deadlock auftritt. Wenn man Pech hat, muss
man trotzdem unendlich lang warten bis er passiert ;). Die besten Erfahrungen hab ich mit 3 Threads gemacht,
da passiert es am schnellsten.
sollen sich bei der letzten Teilaufgabe die Philosophen abwechseln oder sind auch längere Passagen eines Philosophen ok?
Noch ne andere Frage zu der letzten Aufgabe d).
In der Aufgabe steht
und im Beispiel der „leichten“ Variante
Die einfache Variante hört sich an als wäre eine syncronized Methode keine schlechte Idee, jedoch besagt die erste Anforderung das möglichst viele gleichzeitig essen sollen, also der Waiter mehrere Paare verfügbarer Gabeln gleichzeitig an den „Tisch“ bringt.
Gibt die leichte Variante einen Punktabzug oder reicht dies?
Wie bei den anderen Teilaufgaben auch: Jeder Philosoph sollte immer mal wieder essen können. Striktes „Abwechseln“ ist nicht nötig.
Wenn in der einfachen Variante ein Philosoph den Waiter um Erlaubnis fragt und dieser „Ja“ sagt, dann bekommt solange kein anderer Philosoph die Erlaubnis zu Essen, bis dieser erste Philosoph beide Gabeln genommen hat. Danach bekommt der nächste Philosoph die Erlaubnis zu essen. Das hindert ja nicht möglichst viele Philosophen daran, gleichzeitig zu essen, da sie damit ja erst beginnen können, wenn sie beide Gabeln haben. Oder wo siehst du den Widerspruch?
Es wäre noch möglich zwei Philosophen die sich keine Ressourcen teilen gleichzeitig abzuarbeiten ohne zu synchronisieren.
Ja, das wäre dann eine bessere Variante. Allerdings können dabei auch nicht mehr Philosophen maximal gleichzeitig essen als bei der einfachen Variante.
Ich habe eine Frage zur Teilaufgabe b:
Bei a) kommt es bei mir zum Dead-lock.
Das gleichzeitige Nehmen der Gabeln würde ich mit einem synchronized machen und als lock-Object Dinner verwenden.
Der Deadlock bleibt aber bei mir, selbst wenn ich die komplette eat Methode als synchronized deklariert haben…
Muss ich beim lock Objekt noch was beachten?
Hat sich erledigt, eine Klasse war bei mir falsch benannt…
Frage: Müssen die Implementierungen für 2 Philosophen funktionieren? Und für 1 Philosoph, was ja am Problem vorbei geht und ggf. eine Sonderlösung mit der Gabelanzahl benötigt?
Danke schonmal!
Ich hätte auch noch eine Frage:
Müssen die Threads irgendwann beendet werden? Oder ist es in Ordnung, wenn sie einfach endlos weiterlaufen?
Müssen die Threads irgendwann beendet werden? Oder ist es in Ordnung, wenn sie einfach endlos weiterlaufen?
@Override
public void run() {
while (true){
think();
eat();
}
Starker Indikator für nein.
ok, macht sinn. (; danke (:
Frage: Müssen die Implementierungen für 2 Philosophen funktionieren? Und für 1 Philosoph, was ja am Problem vorbei geht und ggf. eine Sonderlösung mit der Gabelanzahl benötigt?
Für zwei und mehr Philosophen sollte es funktionieren.