UniTO/anno2/Galla/MCAD/caffe.md
2019-01-23 12:09:27 +01:00

1.8 KiB

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);
	}
}