emp3hack icon

esame-02-07-14 SO

emp3hack | PRO | 12/27/15 09:40:43 AM UTC | 0 ⭐ | 11917 👁️ | Never ⏰ | []
C for Macs |

0 B

|

None

|

0 👍

/

0 👎

/* 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 <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
 
#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();
    
}

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎