Problemi tipici di sincronizzazione

Esamineremo alcuni problemi di sincronizzazione, come esempio di classi di problemi connessi al controllo della concorrenza

Presenteremo per questi problemi soluzioni basate su semafori

I problemi sono:

Produttori e consumatori con memoria limitata

Variabili condivise:

item vettore[n];

semaforo piene; //numero di posizioni piene

semaforo vuote; //numero di posizioni vuote

semaforo mutex; //mutua esclusione accessi al vettore

Inizialmente:

piene = 0, vuote = n, mutex = 1

Produttori e consumatori con memoria limitata: processo produttore

do
{
	..
	produce un elemento in appena_prodotto
	..
	wait(vuote);
	wait(mutex);
	..
	inserisci in vettore l'elemento in appena_prodotto
	..
	signal(mutex);
	signal(piene);
} while (true);

Produttori e consumatori con memoria limitata: processo consumatore

do
{
	wait(piene);
	wait(mutex);
	..
	rimuovi un elemento da vettore e mettilo in da_consumare
	..
	signal(mutex);
	signal(vuote);
	..
	consuma l'elemento contenuto in da_consumare
	..
} while (true);

Problema dei lettori e degli scrittori

Si consideri un insieme di dati (ad esempio un file) che si deve condividere tra processi concorrenti

Alcuni processi leggeranno (lettori) altri aggiorneranno (lettura + scrittura) (scrittori)

Se più lettori accedono concorrentemente all’insieme di dati condiviso non c’è nessun problema

Se uno scrittore accede, gli altri processi non possono accedere

Gli scrittori devono avere accesso esclusivo