151 lines
2.5 KiB
Markdown
151 lines
2.5 KiB
Markdown
|
# Il bar dello stadio
|
||
|
|
||
|
Analisi di alcune soluzioni proposte del problema "il bar dello stadio".
|
||
|
|
||
|
## Soluzione Semafori
|
||
|
|
||
|
```
|
||
|
semaphore mutex = 1;
|
||
|
semaphore pulizia = 0;
|
||
|
semaphore casa = 0;
|
||
|
semaphore ospiti = 0;
|
||
|
bool pulizia = false;
|
||
|
int n_casa = 0;
|
||
|
int n_ospiti = 0;
|
||
|
int attesa_casa = 0
|
||
|
int attesa_ospiti = 0;
|
||
|
```
|
||
|
```
|
||
|
void entra_bar_casa () {
|
||
|
P (mutex);
|
||
|
if (pulizia || n_casa > NMAX || n_ospiti > 0 || attesa_ospiti > 0) {
|
||
|
attesa_casa++;
|
||
|
V (mutex);
|
||
|
P (casa);
|
||
|
attesa_casa--;
|
||
|
}
|
||
|
n_casa++;
|
||
|
if (n_casa < NMAX && attesa_casa > 0 ) {
|
||
|
V(casa);
|
||
|
} else {
|
||
|
V(mutex);
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
```
|
||
|
void esci_bar_casa () {
|
||
|
P (mutex);
|
||
|
n_casa--;
|
||
|
if (pulizia && n_casa == 0 ) {
|
||
|
V (pul);
|
||
|
} else if (attesa_ospiti > 0 && !pulizia && n_casa == 0) {
|
||
|
V (ospiti);
|
||
|
} else if (attesa_ospiti == 0 && !pulizia && attesa_casa > 0) {
|
||
|
V (casa);
|
||
|
} else {
|
||
|
V (mutex);
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
```
|
||
|
void entra_bar_ospiti() {
|
||
|
P (mutex);
|
||
|
if (pulizia || n_ospiti > NMAX ) {
|
||
|
attesa_ospiti++;
|
||
|
V (mutex);
|
||
|
P (ospiti);
|
||
|
attesa_ospiti--;
|
||
|
}
|
||
|
n_ospiti++;
|
||
|
if (n_ospiti < NMAX && attesa_ospiti > 0 ) {
|
||
|
V(ospiti);
|
||
|
} else {
|
||
|
V(mutex);
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
```
|
||
|
void esci_bar_ospiti () {
|
||
|
P (mutex);
|
||
|
n_ospiti--;
|
||
|
if (pulizia && n_ospiti == 0 ) {
|
||
|
V (pul);
|
||
|
} else if (attesa_ospiti > 0 ) {
|
||
|
V (ospiti);
|
||
|
} else if (attesa_ospiti == 0 && !pulizia && attesa_casa > 0 && n_ospiti == 0) {
|
||
|
V (casa);
|
||
|
} else {
|
||
|
V (mutex);
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
```
|
||
|
void inizio_pulizia () {
|
||
|
P (mutex);
|
||
|
pulizia = true;
|
||
|
if (n_ospiti > 0 || n_casa > 0) {
|
||
|
V (mutex);
|
||
|
P (pulizia);
|
||
|
}
|
||
|
V (mutex);
|
||
|
}
|
||
|
```
|
||
|
```
|
||
|
void fine_pulizia () {
|
||
|
P (mutex);
|
||
|
pulizia = false;
|
||
|
if (attesa_ospiti > 0) {
|
||
|
V (ospiti);
|
||
|
} else if (attesa_casa > 0) {
|
||
|
V (casa);
|
||
|
} else {
|
||
|
V (mutex);
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
*(la soluzione potrebbe non essere la migliore, implementare di nuovo)*
|
||
|
|
||
|
## Soluzione Monitor
|
||
|
*(parziale, va implementata completamente)*
|
||
|
|
||
|
```
|
||
|
public void apriBar () {
|
||
|
chiusura = false;
|
||
|
if (!empty(attesa_ospiti)) {
|
||
|
signal(attesa_ospiti);
|
||
|
} else if (!empty(attesa_casa)) {
|
||
|
signal(attesa_casa);
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
```
|
||
|
public void entra_ospite () {
|
||
|
if (chiusura || n_ospiti == NMAX || n_casa > 0 ) {
|
||
|
wait(attesa_ospiti);
|
||
|
}
|
||
|
n_ospiti++;
|
||
|
if (n_ospiti < NMAX && !empty(attesa_ospiti)) {
|
||
|
signal (attesa_ospiti);
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
```
|
||
|
public void esci_ospite () {
|
||
|
n_ospiti--;
|
||
|
if (chiusura && n_ospiti == 0) {
|
||
|
signal(pulizia);
|
||
|
} else if (n_ospiti == 0 && empty(attesa_ospiti) && !empty(attesa_casa)) {
|
||
|
signal(attesa_casa);
|
||
|
} else {
|
||
|
signal(attesa_ospiti);
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Soluzione con scambio di messaggi
|
||
|
|
||
|
*(implementare)*
|
||
|
|
||
|
|
||
|
|