/* 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
0 B
|👍
/👎
0 B
|👍
/👎