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