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