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]