Si assumano:
Soluzione valida del problema:
Talvolta c’è una condizione aggiuntiva:
Si assuma che il buffer sia un array di 10 interi gestito circolarmente.
Si assumano i seguenti vincoli aggiuntivi:
I processi che tentano di effettuare operazioni al momento non consentite devono essere messi in attesa.
Programmare il sistema sfruttando i semafori con la semantica tradizionale.
semaphore empty = 10, full = 0, mutex_p = 1, mutex_c = 1;
semaphore sem_3 = 1, sem_5 = 2;
int i = 0, j = 0;
produttore(){
int item;
while(true){
...
item = ...;
if(item == 3) wait(sem_3);
if(item == 5) wait(sem_5);
wait(empty);
wait(mutex_p);
buffer[i] = item;
i = i+1%10;
signal(mutex_p);
signal(full);
...
}
}
consumatore(){
int item;
while(true){
...
wait(full);
wait(mutex_c);
item = buffer[j];
j = j+1%10;
signal(mutex_c);
if(item == 3) signal(sem_3);
if(item == 5) signal(sem_5);
signal(empty);
...
}
}