Si programmi un sistema in cui un insieme di processi condivide un array A di 3 interi (indici 0, 1 e 2).
I valori iniziali dell’array sono tutti 0 (A[0] = A[1] = A[2] = 0)
Esistono le seguenti classi di processi:
Condizioni:
//semafori
mutex = 1; //per mutua esclusione
sem_R; //per i lettori
sem_i; //per gli scrittori su A[i];
//variabili
wait_R; //numero di lettori in waiting
wait_i; //numero di scrittori in waiting su A[i];
run_R; //numero lettori working
run_i; //true se uno scrittore sta lavorando su A[i]
x; //bonus lettori
x_i; //bonus scrittori su i
reader(){
while(true){
wait(mutex);
while((run_0 || run_1 || run_2) ||
((wait_0 > 0 || wait_1 > 0 || wait_2 > 0) && x == 0)){
wait_R++;
signal(mutex);
wait(sem_R);
wait(mutex);
}
run_R++;
(*) x_0 = x_1 = x_2 = 4;
if(wait_0 > 0 || wait_1 > 0 || wait_2 > 0) x--;
signal(mutex);
int Z = A[0] + A[1] + A[2];
wait(mutex);
run_R--;
if(run_R == 0){
(**) x = 10;
for(int i = 0; i < 3; i++){
if(wait_i > 0){
wait_i--;
signal(sem_i);
}
}
}
signal(mutex);
}
}
write(){
while(true){
int i = ...; int v = ...;
wait(mutex);
while(run_R > 0 || run_i > 0 || (wait_R > 0 && x_i == 0)){
wait_i++;
signal(mutex);
wait(sem_i);
wait(mutex);
}
run_i = true;
(*) x = 10;
if(wait_R > 0){
x_i--;
signal(sem_i);
}
if(!run_((i+1)%2) && !run_((i+2)%2){
(**) x_0 = x_1 = x_2 = 4;
while(wait_R > 0){
wait_R--;
signal(sem_R);
}
}
signal(mutex);
}
}