UniTO/anno2/Sem1/Galla/MCAD/caffe.md

98 lines
1.8 KiB
Markdown
Raw Permalink Normal View History

2019-01-23 12:03:37 +01:00
# 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);
}
}
```