INFOPedia : LSOMuseo

HomePage :: Categorie :: Indice :: Ultime modifiche :: Ultimi commenti :: Login/Registrazione

PROBLEMA DEL MUSEO


In un museo si possono visitare tre stanze ma per sicurezza in ogni stanza non può avere più di 10 visitatori per volta.

I visitatori
arrivano al museo
finchè non visitano le tre stanze
o scelgono una delle tre stanze da visitare
o attende che possa entrare nella stanza
o visita la stanza per un tempo randomica
o esce dalla stanza

Si sviluppi il programma che simuli la situazione precedente considerando le funzioni "visitatore" come threads di un unico processo:
a) descrivere le scelte fatte e giustificarle.
b) scrivere il codice delle funzioni in C in ambiente windows o linux.
c) motivare lassenza di deadlock.

Assenza di deadlock è verificata perchè neghiamo tutte le condizioni (ndr Diciamo che ne siamo abbastanza sicuri, ma non ci mettiamo la mano sul fuoco.... )


//-------------------------------------
//IMPORTO LE LIBRERIE NECESSARIE
//-------------------------------------
#include <stdio.h>
#include <windows.h>
#include <conio.h>
#include <time.h>

//-------------------------------------
//COSTANTI E FUNZIONI
//-------------------------------------
#define randomize(num) srand((unsigned)time(NULL)*(num));
#define GetRandom(min,max) (rand()%((int)(max)-(min)+1)+(min));

#define __Capienza 3
void visitatore(int *id2);

//-------------------------------------
//VARIABILI
//-------------------------------------
HANDLE stanza[3];
//-------------------------------------
//MAIN
//-------------------------------------
void main(){
    int i,id=0;
    for(i=0;i<3;i++)
        stanza[i] = CreateSemaphore(NULL,__Capienza,__Capienza,NULL);
   
    while(getch()!= 'q'){                            //ogni volta che premo un pulsante creo un visitatore, q per uscire
        id++;
        CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)visitatore,(LPVOID) &id,0,NULL);
    }

}
//-------------------------------------
//THREAD
//-------------------------------------

void visitatore(int *id2){
    int i,visitato[3] ={0,0,0},finito = 0,id=*id2,tempo;

    while (finito == 0){                                //fino a quando finito è uguale a zero (fino a quando non ho visitato le 3 stanze)
   
        for(i=0;i<3;i++){                                //Ciclo per ogni stanza
            if ((visitato[i]==0) && ((WaitForSingleObject(stanza[i],500)) != WAIT_TIMEOUT))   // se la stanza non è stata ancora visitata e la Wait non va in Timeout
            {
                printf("Visitatore **%d** ENTRA nella stanza %d\n",id,i);
                tempo = GetRandom(1000,3000)
                Sleep(tempo);
                visitato[i] =1;
                printf("Visitatore **%d** ESCE dalla stanza %d\n",id,i);
                ReleaseSemaphore(stanza[i],1,NULL);        //rilascio il semaforo
            }
        }

        if ((visitato[0] == 1) &&(visitato[1] == 1) && (visitato[2] == 1))  //setta finito ad 1 quando vengono visitate tutte e 3 le stanze
            finito=1;
    }

    printf("Visitatore *******%d******* lascia il museo\n",id);
}




Torna a Lab Sistemi Operativi

Non ci sono commenti in questa pagina. [Scrivi commento]

Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by Wikka Wakka Wiki 1.1.6.1
La pagina è stata generata in 0.1180 secondi