Si assumano:

Untitled

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


Produttori e consumatori v2