# Semaphoren



## rafi072001 (17. Jun 2021)

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:


```
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._


----------



## mrBrown (17. Jun 2021)

Deinem Code fehlen alle Indizes, die sind bei der Formatirrung verloren gegangen.

Was sind p und v denn überhaupt?


----------



## rafi072001 (17. Jun 2021)

Das ist eben das Semaphore-Prinzip, dass bestimmte Teile des Programms im Ausschluss von einander gemacht werden -> Bsp. Drucker etc.


----------

