/* Compito esame del 02/07/14 * * In un laboratorio di radiologia vengono effettauti due tipi di analisi: * 1. radiografie * 2. tomografie assiali computerizzate (TAC) * * Il personale specializzato del laboratorio e' costituito da un medico e da due tecnici di radiologia. * Per effettuare una TAC e' richiesta la presenza del medico e di un tecnico, mentre le radiografie vengono eseguite da un tecnico solamente. * Quando un paziente arriva al laboratorio attende di essere servito in base al tipo di esame da compiere * (radiografia o TAC) non appena un tecnico e il medico, se necessario per i tipo di analisi, sono disponibili. * Completato l’esame il paziente paga il ticket alla cassa mettendosi in attesa in caso sia occupata; * i pazienti esenti non attendono e lasciano lo studio. * Modellando i pazienti mediante threads, si realizzi un programma in C che simuli le attivita' del laboratorio * generando in modo casuale l’arrivo delle diverse tipologie di pazienti. * */ #include #include #include #include #define NMED 2 #define NTEC 1 #define NCAS 1 sem_t s_nmedici; // Numero medici, inizializza a NMED sem_t s_ntecnici; // Numero tecnici, inizializza a NTEC sem_t s_ncasse; // Numero di casse, inizializza a NCAS void faiesame(); void pagaticket(); void* pazienteTAC(); void* pazienteRad(); int main(int argc, char const *argv[]){ // Inizializzo semafori sem_init(&s_nmedici, 0, NMED); sem_init(&s_ntecnici, 0, NTEC); sem_init(&s_ncasse, 0, NCAS); // int r; pthread_t pid; srand(time(NULL)); while(1){ r = rand()%2; // Determino tipo di paziente switch(r){ case 0: // Radiografia pthread_create(&pid, NULL, pazienteRad, NULL); usleep(250000); break; case 1: // TAC pthread_create(&pid, NULL, pazienteTAC, NULL); usleep(2500000); break; } } } void* pazienteTAC(void* param){ // Serve un medico e tecnico sem_wait(&s_nmedici); sem_wait(&s_ntecnici); // Disponibile medico e tecnico faiesame(); sem_wait(&s_ncasse); pagaticket(); // Pagaticket } void* pazienteRad(void* param){ // Serve un tecnico sem_wait(&s_ntecnici); faiesame(); sem_wait(&s_ncasse); pagaticket(); }