emp3hack

esame-02-07-14 SO

Dec 27th, 2015
245
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /* Compito esame del 02/07/14
  2.  *
  3.  * In un laboratorio di radiologia vengono effettauti due tipi di analisi:
  4.  *  1. radiografie
  5.  *  2. tomografie assiali computerizzate (TAC)
  6.  *
  7.  * Il personale specializzato del laboratorio e' costituito da un medico e da due tecnici di radiologia.
  8.  * Per effettuare una TAC e' richiesta la presenza del medico e di un tecnico, mentre le radiografie vengono eseguite da un tecnico solamente.
  9.  * Quando un paziente arriva al laboratorio attende di essere servito in base al tipo di esame da compiere
  10.  * (radiografia o TAC) non appena un tecnico e il medico, se necessario per i tipo di analisi, sono disponibili.
  11.  * Completato l’esame il paziente paga il ticket alla cassa mettendosi in attesa in caso sia occupata;
  12.  * i pazienti esenti non attendono e lasciano lo studio.
  13.  * Modellando i pazienti mediante threads, si realizzi un programma in C che simuli le attivita' del laboratorio
  14.  * generando in modo casuale l’arrivo delle diverse tipologie di pazienti.
  15.  *
  16.  */
  17.  
  18.  
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <pthread.h>
  22. #include <semaphore.h>
  23.  
  24. #define NMED 2
  25. #define NTEC 1
  26. #define NCAS 1
  27.  
  28. sem_t s_nmedici; // Numero medici, inizializza a NMED
  29. sem_t s_ntecnici; // Numero tecnici, inizializza a NTEC
  30. sem_t s_ncasse; // Numero di casse, inizializza a NCAS
  31.  
  32. void faiesame();
  33. void pagaticket();
  34. void* pazienteTAC();
  35. void* pazienteRad();
  36.  
  37.  
  38. int main(int argc, char const *argv[]){
  39.    
  40.     // Inizializzo semafori
  41.     sem_init(&s_nmedici, 0, NMED);
  42.     sem_init(&s_ntecnici, 0, NTEC);
  43.     sem_init(&s_ncasse, 0, NCAS);
  44.  
  45.     //
  46.     int r;
  47.     pthread_t pid;
  48.     srand(time(NULL));
  49.    
  50.     while(1){
  51.         r = rand()%2; // Determino tipo di paziente
  52.         switch(r){
  53.             case 0: // Radiografia
  54.                 pthread_create(&pid, NULL, pazienteRad, NULL);
  55.                 usleep(250000);
  56.                 break;
  57.             case 1: // TAC
  58.                 pthread_create(&pid, NULL, pazienteTAC, NULL);
  59.                 usleep(2500000);
  60.                 break;
  61.         }
  62.     }
  63.  
  64.  
  65. }
  66.  
  67.  
  68. void* pazienteTAC(void* param){
  69.     // Serve un medico e tecnico
  70.     sem_wait(&s_nmedici);
  71.     sem_wait(&s_ntecnici);
  72.    
  73.     // Disponibile medico e tecnico
  74.     faiesame();
  75.    
  76.     sem_wait(&s_ncasse);
  77.     pagaticket();
  78.     // Pagaticket
  79. }
  80.  
  81. void* pazienteRad(void* param){
  82.     // Serve un tecnico
  83.     sem_wait(&s_ntecnici);
  84.  
  85.     faiesame();
  86.  
  87.     sem_wait(&s_ncasse);
  88.     pagaticket();
  89.    
  90. }
RAW Paste Data