![]() | ![]() |
|
|
COSTRUTTO MONITOR: PROBLEMA LETTORI-SCRITTORI
Riconsideriamo il problema dei lettori scrittori. Ricordiamo che la politica di assegnazione ottimale della risorsa (pag. 80) stabilisce che un nuovo lettore non possa acquis 727h75h ire la risorsa se c'è uno scrittore in attesa, e che tutti i lettori sospesi al termina di una scrittura abbiano la priorità sul successivo scrittore.
Indichiamo allora con:
- num_lettori : numero dei processi lettori attivi sulla risorsa;
- occupato : variabile booleana che vale true se la risorsa è occupata da uno scrittore;
- ok_lettura, ok_scrittura : variabili condition su cui si sospendono rispettivamente lettori e scrittori.
Il codice è:
Type lettori_scrittori = MONITOR ;
var num_lettori : integer ;
occupato : boolean ;
ok_lettura, ok_scrittura : condition ;
Procedure entry Inizio_lettura ;
begin
if occupato or ok_scrittura.queue then
ok_lettura.wait ;
num_lettori : = num_lettori + 1 ;
ok_lettura.signal ;
end ;
Quando un lettore viene sbloccato (a causa dell'uscita di uno scrittore), grazie all'istruzione ok_lettura.signal esso sblocca a sua volta un altro lettore. Lo stesso farà quest'ultimo con un altro lettore in attesa, e così via. In questo modo si realizza la 'liberazione a cascata' di tutti gli eventuali lettori in attesa. Ricordiamo che detta istruzione non ha effetto se non ci sono processi da sbloccare. Vediamo ora la procedure di fine lettura.
Procedure entry Fine_lettura ;
begin
num_lettori : = num_lettori - 1 ;
if num_lettori = 0 then ok_scrittura.signal ;
end ;
Quando tutti i processi lettori sono usciti, è necessario e sufficiente offrirsi di liberare un eventuale scrittore bloccato. Se non esiste alcuno scrittore in attesa, sicuramente non esisteranno neanche lettori in attesa.
Procedure entry Inizio_scrittura ;
begin
if num_lettori <> 0 or occupato then
ok_scrittura.wait ;
occupato : = true ;
end ;
Procedure entry Fine_scrittura ;
begin
occupato : = false ;
if ok_lettura.queue then
ok.lettura.signal
else ok_scrittura.signal ;
end ;
begin
num_lettori : = 0 ;
occupato : = false ;
end ;
Privacy |
Articolo informazione
Commentare questo articolo:Non sei registratoDevi essere registrato per commentare ISCRIVITI |
Copiare il codice nella pagina web del tuo sito. |
Copyright InfTub.com 2025