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