Barbiere dormiglione



Scaricare 87.96 Kb.
Pagina8/8
22.12.2019
Dimensione del file87.96 Kb.
1   2   3   4   5   6   7   8
thread GenericoCliente

;

MutexOrdini.acquire();

OrdiniPendenti ++;



;

AttesaOrdine.signal (MutexOrdini); //ha effetto solo se l'addetto è sospeso//

MutexOrdini.release();

MutexFittizio.acquire();

//l’associazione della condition a una lock è obbligatoria, anche quando, come in questo caso, si voglia una //

//sospensione incondizionata//

consegna.wait (MutexFittizio);

//attende incondizionatamente la consegna//

MutexFittizio.release();

dove la lock MutexFittizio è introdotta unicamente per motivi sintattici (la funzione wait ha sempre un parametro di tipo lock), e non viene utilizzata altrove.

Si chiede di realizzare le funzioni eseguite dal thread Addetto e dal thread Cuoco, usando le opportune operazioni sulle variabili condizione e sulle lock.
SOLUZIONE

thread Addetto

while true {

MutexOrdini.acquire(); ;

while (OrdiniPendenti== 0) AttesaOrdine.wait (MutexOrdini); //attende un ordine//

OrdiniPendenti --;

//gestisce gli ordini//

MutexOrdini.release();

MutexScaffale.acquire();



while (HamburgerPronti== 0) HamburgerNelloScaffale.wait (MutexScaffale);

//attende la disponibilità di almeno un hamburger nello scaffale//


;


HamburgerPronti --;

PostoLiberoNelloScaffale.signal (MutexScaffale);

MutexScaffale.release();

consegna.signal (MutexFittizio)

//consegna un hamburger, riattivando il cliente//

}
thread Cuoco

while true {

MutexScaffale.acquire();



while (HamburgerPronti== 10) PostoLiberoNelloScaffale.wait (MutexScaffale);

//attende la disponibiltà di almeno un posto libero nello scaffale //



HamburgerPronti ++;

HamburgerNelloScaffale.signal(MutexScaffale);

//ha effetto solo se l’inserviente è sospeso//

MutexScaffale.release();

}


Condividi con i tuoi amici:
1   2   3   4   5   6   7   8


©astratto.info 2019
invia messaggio

    Pagina principale