Parco divertimenti – Appello 21/07/2009

Transcript

Parco divertimenti – Appello 21/07/2009
Parco divertimenti – Appello 21/07/2009
All’interno di un parco divertimenti l’accesso alla attrazione “Ruota panoramica” e’ gestito attraverso 3
tornelli per lo smistamento dei clienti e la gestione delle code e da un operatore che mette in funzione la
ruota (detto operatore_ruota).
Lo smistamento dei turisti e’ necessario perché il parco divertimenti prevede due modalità di accesso, una
normal ed una fast, cui corrisponde un biglietto di ingresso di prezzo più elevato, che prevede un accesso
con priorità e garantisce attese in coda più brevi. Quando i clienti arrivano all’ingresso dell’attrazione si
mettono in fila nella coda corrispondente alla propria modalità di ingresso, fast o normal. In cima ad
ognuna delle due code e’collocato un tornello, attivato attraverso il pass del cliente e che gestisce il
corretto ordine di accesso alla ruota panoramica. L’elevato numero di persone permette di assumere che le
code siano sempre piene, back-logged. Per evitare starvation sulla coda dei turisti normali, il regolamento
prevede che venga fatto entrare un cliente normale ogni 4 con priorità.
I clienti arrivano quindi al terzo tornello che controlla l’accesso alla ruota.
Esso fa passare il numero massimo consentito di passeggeri sulla ruota, dopo di che arresta la coda e la
riapre quando lo spettacolo e’finito e tutti i clienti sono usciti.
L’operatore_ruota attiva la ruota quando ha raggiunto il numero massimo di passeggeri e, quando il
tempo di durata del giro e’ terminato, fa uscire le persone.
Il sistema è modellato tramite thread: uno per l’operatore-ruota ed uno per ogni cliente, distinguendo fra
clienti “normal” o “fast”.
struct ruota_t { ... } ruota;
void init_ruota(struct ruota_t *p);
void operatore_ruota_inizio_giro(struct ruota_t *p);
void operatore_ruota_fine_giro(struct ruota_t *p);
void cliente_normale_accesso(struct ruota_t *p);
void cliente_normale_uscita(struct ruota_t *p);
void cliente_fast_ingresso(struct ruota_t *p);
void cliente_fast_uscita(struct ruota_t *p);
void *operatore_ruota(void *arg)
{
while(1) {
<i turisti entrano>
operatore_ruota_inizio_giro(struct ruota_t *p);
<mette in funzione la ruota>
operatore_ruota_fine_giro(struct ruota_t *p);
}
}
void *cliente_normal(void *arg)
{
while(1) {
<vado nella coda giusta>
<presento il pass>
cliente_normale_accesso(&ruota);
<mi accomodo e mi diverto >
<giro finito>
cliente_normale_uscita(&ruota);
}
}
void *cliente_fast(void *arg)
{
while (1) {
<vado nella coda giusta>
<presento il pass>
cliente_fast_accesso(&ruota);
<mi accomodo e mi diverto >
<giro finito>
cliente_fast_uscita(&ruota); }
}
}
Modellare il sistema in linguaggio C con la libreria pthread nel seguente modo utilizzando:
[ ] semafori
Scrivere il contenuto della struct ruota e le funzioni:
• operatore_ruota_inizio_giro,
• operatore_ruota_fine_giro,
• cliente_normale_accesso,
• cliente_normale_uscita,
• cliente_fast_accesso,
• cliente_fast_uscita.
[ ] mutex + variabili condition