Sei sulla pagina 1di 2

Esempio semafori binari per il problema Produttore-Consumatore

Variabili condivise:
binary_semaphore p1,p2,v1,v2;
interi piene, vuote, MAXBUFFER;

si imposta p1.init(1), p2.init(0), v1.init(1), v2.init(0) e MAXBUFFER rappresenta il numero di


blocchi massimi del buffer.
Inizialmente piene=0 e vuote=MAXBUFFER.

Produttore Consumatore
do{ do{

produco un item in nextp p1.down();
piene--;
v1.down(); if(piene<0)
vuote--; p1.up();
if(vuote<0) p2.down();
v1.up(); p1.up();
v2.down(); mutex.down();
v1.up(); ...
mutex.down(); nextc=estrai dal buffer

inserisci nextp nel buffer mutex.up();
v1.down();
mutex.up(); vuote++;
p1.down(); if(vuote<=0)
piene++; v2.up();
if(piene<=0) else
p2.up(); v1.up();
else ...
p1.up(); elabora il dato in nextc
...
}while(TRUE) }while(TRUE)

Ho praticamente modificato le funzioni down e up dei semafori contatore in questo modo


(pseudocodice):
binary_semaphore s1,s2; s1 inizializzato a 1, s2 inizializzato a 0
int C; valore iniziale del semaforo contatore che voglio realizzare

void wait_mod(){
s1.wait(); /* proteggo la modifica di variabili condivise */
C--;
if(C<0){ /* se C<0 ripristino s1, ma mi blocco su s2 che inizializzato a 0 */
s1.up();
s2.down();
}
s1.up(); /* altrimenti ripristino solo s1 */
}
void up_mod(){
s1.wait(); /* proteggo la modifica di variabili condivise */
C++;
if(C<=0)
s2.up(); /* esegue la up di s2 solo se C<=0, cio se ci sono processi in attesa */
else
s1.up(); /* altrimenti ripristino s1 */
}

Per realizzare un semaforo contatore ho bisogno quindi di due semafori binari ed una variabile
condivisa.