Un parcheggio che dispone di 50 posti è accessibile da tre tipi di veicoli:

Non è necessario programmare il comportamento del veicolo all’interno del parcheggio.

//semafori
sem mutex = 1;
sem semV_1 = 0, semV_2 = 0, semV_3 = 0;

//variabili condivise
int waitV_1 = 0, waitV_2 = 0, waitV_3 = 0;
int free = 50;

V_1 {
	wait(mutex);
	if (free == 0) {
		waitV_1 ++;
		signal(mutex);
		wait(semV_1);
	}
	else {
		free --;
		signal(mutex);
	}

	{park}

	wait(mutex);
	free ++;
	if (waitV_1 > 0) {
		while (free > 0 && waitV_1 > 0) {
			waitV_1 --;
			free --;
			signal(semV_1);
		}
	}
	else  if (free > 1 && waitV_2 > 0) {
		while (free > 1 && waitV_2 > 0) {
			waitV_2--;
			free = free - 2;
			signal(semV_2);
		}
	}
	else if (free > 2 && waitV_3 > 0) {
		while (free > 2 && waitV_3 > 0) {
			waitV_3--;
			free = free - 3;
			signal(semV_3);
		}
	}
	signal(mutex);
}

V_2 {
	wait(mutex);
	if (free < 2) {
		waitV_2 ++;
		signal(mutex);
		wait(semV_2);
	}
	else {
		free = free - 2;
		signal(mutex);
	}

	{park}

	wait(mutex);
	free = free + 2;
	if (waitV_2 > 0) {
		while (free > 1 && waitV_2 > 0) {
			waitV_2 --;
			free  = free - 2;
			signal(semV_2);

		}
	}
	else  if (free > 2 && waitV_3 > 0) {
		while (free > 2 && waitV_3 > 0) {
			waitV_3--;
			free = free - 3;
			signal(semV_3);
		}
	}
	else if (free > 0 && waitV_1 > 0) {
		while (free > 0 && waitV_1 > 0) {
			waitV_1--;
			free --;
			signal(semV_1);
		}
	}
	signal(mutex);
}

V_3 {
	wait(mutex);
	if (free < 3) {
		waitV_3 ++;
		signal(mutex);
		wait(semV_3);
	}
	else {
		free = free - 3;
		signal(mutex);
	}

	{park}

	wait(mutex);
	free = free + 3;
	if (waitV_3 > 0) {
		while (free > 2 && waitV_3 > 0) {
			waitV_3 --;
			free  = free - 3;
			signal(semV_3);

		}
	}
	else  if (free > 1 && waitV_2 > 0) {
		while (free > 1 && waitV_2 > 0) {
			waitV_2--;
			free = free - 2;
			signal(semV_2);
		}
	}
	else if (free > 0 && waitV_1 > 0) {
		while (free > 0 && waitV_1 > 0) {
			waitV_1--;
			free --;
			signal(semV_1);
		}
	}
	signal(mutex);
}