Aufgabe Semaphoren

Status
Für weitere Antworten geschlossen.

rafi07

Cadet 4th Year
Registriert
Apr. 2020
Beiträge
81
Hallo ich habe folgende Aufgabe:


Funf Philosophen sitzen gemeinsam an einem runden Tisch, an dem ¨ sie unabh¨angig voneinander von Zeit zu Zeit Spaghetti essen. Jeder Philosoph hat rechts neben seinem Teller nur eine Gabel, ben¨otigt aber zum Essen zwei Gabeln, also auch die seines linken Nachbarn. Aus diesem Grund k¨onnen nicht alle Philosophen gleichzeitig essen, sondern sie mussen sich ¨ bezuglich ihrer ¨ kritischen Abschnitte Essen synchronisieren
Entwerfen Sie nun eine zweite L¨osung unter Verwendung des Konzepts der privaten Semaphore. Gehen Sie davon aus, dass ein Philosoph zyklisch die Zust¨ande denkend, hungrig, essend durchlebt.

Lösung:

Code:
public class Philosopher2 {
private static final int THINK = 1;
private static final int HUNGRY = 2;
private static final int EAT = 3;
private int[] state = new int[5];
private Semaphore[] philos = new Semaphore[5];
private Semaphore mutex = new Semaphore (1);
public Philosopher2 () {
for ( int i=0 ; i<5 ; i++ ) {
state = THINK;
philos = new Semaphore(0);
}
}


private void test ( int i ) {
if ( state[(i+4)%5] != EAT && state[(i+1)%5] != EAT && state == HUNGRY ) {
state = EAT;
philos.v();
}
}
public void eat ( int i ) {
mutex.p();
state = HUNGRY;
test ( i );
mutex.v();
philos.p();
// k.A.: essen;
mutex.p();
state = THINK;
test ( (i+4)%5 );
test ( (i+1)%5 );
mutex.v();
}
}

Ich verstehe nicht ganz warum man in der Test ganz am Ende das Austrittsprotokoll v benutz. Außerdem verstehe ich nicht ganz, warum man ganz unten noch zweimal test ausführt, denn durch test ist ja auch der state auf EAT, was ja eigentlich gar nicht stimmt.
 
Zuletzt bearbeitet:
Pcck den Code am besten mal in [CODE][/CODE] Klammern, dann kann man ihn besser lesen
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben