Benutzer-Werkzeuge

Webseiten-Werkzeuge


parallelism:deadlocks:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
parallelism:deadlocks:start [2025/03/20 15:38] – [Aufgabe 1: Das Philosophenproblem] Martin Pabstparallelism:deadlocks:start [2025/04/08 10:54] (aktuell) – [Aufgabe 1: Das Philosophenproblem] Martin Pabst
Zeile 48: Zeile 48:
 <WRAP center round todo 80%> <WRAP center round todo 80%>
   * a) Erläutern Sie, inwiefern die Coffman-Bedingungen erfüllt sind.   * a) Erläutern Sie, inwiefern die Coffman-Bedingungen erfüllt sind.
-  * b) Starten Sie das untenstehende Programm und untersuchen Sie, ob es zu einer Verklemmung kommt. Welche Rolle spielen die sleep-Anweisungen?+  * b) Starten Sie das untenstehende Programm und untersuchen Sie, ob es zu einer Verklemmung kommt. Welche Rolle spielen die ''sleep''-Anweisungen?
   * c) Ändern Sie das Programm so ab, dass die Bedingung "cyclic waiting" nicht mehr zutrifft und verifizieren Sie, dass damit die Verklemmung nicht mehr auftritt.   * c) Ändern Sie das Programm so ab, dass die Bedingung "cyclic waiting" nicht mehr zutrifft und verifizieren Sie, dass damit die Verklemmung nicht mehr auftritt.
-  * d) Ändern Sie das Programm so ab, dass +  * d) Ändern Sie das Programm so ab, dass eine andere der Coffman-Bedingungen nicht mehr zutrifft. Erläutern Sie Ihr Vorgehen.
 </WRAP> </WRAP>
  
 +<HTML>
  
 +<div class="java-online" style="height: 60vh; width: 100%" data-java-online="{'withBottomPanel': false, 'id': 'Philosophen'}">
 +
 +<script type="text/plain" title="Philosophen.java">
 +new Main().setup();
 +
 +class Main {
 +   
 +   int[] colors = { 0xff0000, 0x00ff00, 0x0000ff, 0x9614d3, 0xf5e400 };
 +
 +   void setup() {
 +      Fork[] forks = new Fork[5];
 +      for (int i = 0; i < 5; i++) {
 +         forks[i] = new Fork(i);
 +      }
 +
 +      for (int i = 0; i < 5; i++) {
 +         new Philosopher(i, colors[i], forks[(5 + i - 1) % 5], forks[i]).start();
 +      }
 +   }
 +
 +}
 +
 +
 +class Philosopher extends Thread {
 +   
 +   int color;
 +   Fork forkLeft;
 +   Fork forkRight;
 +
 +   Philosopher(int number, int color, Fork forkLeft, Fork forkRight) {
 +      Circle circle = new Circle(600, 300, 50);
 +      circle.rotate(360 / 5.0 * number, 400, 300);
 +      circle.setFillColor(color); 
 +      this.color = color;
 +      this.forkLeft = forkLeft;
 +      this.forkRight = forkRight;
 +   }
 +
 +   public void run() {
 +      while (true) {
 +         forkLeft.take(color);
 +         sleep(10); 
 +         forkRight.take(color);
 +         
 +         println("Philosopher eats", color);
 +         sleep(100);   // eat
 +
 +         forkRight.put();
 +         forkLeft.put();
 +         
 +         println("Philosopher talks", color);
 +         sleep(10);   // talk ;-)
 +      }
 +   }
 +
 +}
 +
 +
 +class Fork extends Line {
 +   
 +   static final int gray = 0x808080;
 +   int color = gray;
 +
 +   Fork(int number) {
 +      super(500, 300, 580, 300);
 +      setBorderColor(color);
 +      rotate(360 / 10.0 + 360 / 5.0 * number, 400, 300);
 +   }
 +
 +   synchronized void take(int newColor) {
 +      if(color != gray) {
 +         wait();
 +      }
 +      color = newColor;
 +      setBorderColor(newColor);
 +   }
 +
 +   synchronized void put() {
 +      color = gray;
 +      setBorderColor(gray);
 +      notify();
 +   }
 +
 +}
 +</script>
 +
 +</div>
 +
 +</HTML>
 +
 +[[.philosophenloesung:start|Lösung]]
parallelism/deadlocks/start.1742485115.txt.gz · Zuletzt geändert: 2025/03/20 15:38 von Martin Pabst

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki