97 lines
1.8 KiB
Markdown
97 lines
1.8 KiB
Markdown
# Miscelatura di Caffe'
|
|
|
|
## Inizializzazione
|
|
|
|
```
|
|
sem mutex = 1;
|
|
sem arabica = 0, robusta = 0;
|
|
sem estrai = 0;
|
|
const int maxArabica = 2*MAX/3
|
|
const int maxRobusta = MAX-maxArabica;
|
|
const int sacco = C;
|
|
int cntArabica = 0;
|
|
int cntRobusta = 0;
|
|
int attesaArabica = 0;
|
|
int attesaRobusta = 0;
|
|
int attesaEstrattori = 0;
|
|
```
|
|
|
|
## Operai versatori
|
|
|
|
### Versatori di Arabica
|
|
|
|
```
|
|
public void versaArabica () {
|
|
P (mutex);
|
|
if (cntArabica == maxArabica) {
|
|
V(mutex);
|
|
attesaArabica++;
|
|
P (arabica);
|
|
attesaArabica--;
|
|
}
|
|
...versa...
|
|
cntArabica++;
|
|
|
|
if (attesaArabica > 0 && cntArabica < maxArabica) {
|
|
V(arabica);
|
|
} else if (attesaRobusta > 0 && cntRobusta < maxRobusta) {
|
|
V(robusta);
|
|
} else if (cntRobusta == 2*cntArabica && (cntArabica +cntRobusta > sacco) && attesaEstrattori > 0) {
|
|
V(estrai);
|
|
} else {
|
|
V(mutex);
|
|
}
|
|
}
|
|
```
|
|
|
|
### Versatori di Robusta
|
|
|
|
```
|
|
public void versaRobusta () {
|
|
P (mutex);
|
|
if ((attesaArabica > 0 && cntArabica < maxArabica) || cntRobusta == maxRobusta) {
|
|
V(mutex);
|
|
attesaRobusta++;
|
|
P (robusta);
|
|
attesaRobusta--;
|
|
}
|
|
...versa...
|
|
cntRobusta++;
|
|
|
|
if (attesaArabica > 0 && cntArabica < maxArabica) {
|
|
V(arabica);
|
|
} else if (attesaRobusta > 0 && cntRobusta < maxRobusta) {
|
|
V(robusta);
|
|
} else if (cntRobusta == 2*cntArabica && (cntArabica +cntRobusta > sacco) && attesaEstrattori > 0) {
|
|
V(estrai);
|
|
} else {
|
|
V(mutex);
|
|
}
|
|
}
|
|
```
|
|
## Operai insaccatori
|
|
|
|
```
|
|
public void insaccaMiscela () {
|
|
P (mutex);
|
|
if (!(cntRobusta == 2*cntArabica && (cntArabica +cntRobusta > sacco))) {
|
|
V (mutex);
|
|
attesaEstrattori++;
|
|
P (estrai);
|
|
attesaEstrattori--;
|
|
}
|
|
<...estrai...>
|
|
cntRobusta = cntRobusta - sacco/3;
|
|
cntArabica = cntArabica - 2*sacco/3;
|
|
|
|
if (attesaArabica > 0) {
|
|
V(arabica);
|
|
} else if (attesaRobusta > 0) {
|
|
V(robusta);
|
|
} else if ((cntArabica + cntRobusta > sacco) && attesaEstrattori > 0) {
|
|
V(estrai);
|
|
} else {
|
|
V(mutex);
|
|
}
|
|
}
|
|
```
|