Una palestra può ospitare al massimo 40 clienti. Esistono due tipologie di cliente: regular e premium.

Un cliente premium può essere ammesso alla palestra solo se c’è almeno un posto libero.

Un cliente regular può essere ammesso alla palestra solo se sono verificate entrambe le seguenti due condizioni:

Programmare l’ingresso e l’uscita dalla palestra per entrambi i tipi di processo cliente, nel rispetto di quanto segue:

Non è necessario programmare il comportamento dei clienti all’interno della palestra.

//semafori
sem mutex = 1;
sem semRegular = 0, semPremium = 0;

//variabili condivie
postiOccupati = 0, attesaRegular = 0, attesaPremium = 0, premiumIn = 0;

entrataRegular(){
	wait(mutex);
	if((postiOccupati == 40) || (postiOccupati >= 20 && (premiumIn / postiOccupati) <= 0.5)){
		attesaRegular++;
		signal(mutex);
		wait(semRegular);
	}else{
		postiOccupati++;
		signal(mutex);
	}
}

entrataPremium(){
	wait(mutex);
	if(postiOccupati == 40){
		attesaPremium++;
		signal(mutex);
		wait(semPremium);
	}else{
		postiOccupati++;
		premiumIn++;
		signal(mutex);
	}
}

uscitaPremium(){
	wait(mutex);
	if(attesaPremium > 0){
		attesaPremium--;
		signal(semPremium);
	}else if(attesaRegular > 0 && (postiOccupati <= 20 || (premiumIn / postiOccupati) > 0.5)){
		attesaRegular--;
		premiumIn--;
		signal(semRegular);
	}else{
		postiOccupati--;
		premiumIn--;
	}
	signal(mutex);
}

uscitaRegular(){
	wait(mutex);
	if(attesaPremium > 0){
		attesaPremium--;
		signal(semPremium);
	}else if(attesaRegular > 0 && (postiOccupati <= 20 || (premiumIn / postiOccupati) > 0.5)){
		attesaRegular--;
		signal(semRegular);
	}else{
		postiOccupati--;
	}
	signal(mutex);
}

clienteRegular(){entrataRegular(); allenamento(); uscitaRegular();}
clientePremium(){entrataPremium(); allenamento(); uscitaPremium();}