Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* 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();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement