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