emp3hack

esame-28-02-13 SO

Dec 27th, 2015
293
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /* Esame del 28/02/13
  2.  *
  3.  * Siamo in periodo di elezioni e si vuole avere un programma che simuli il comportamento
  4.  * degli elettori al seggio elettorale.
  5.  * Nel seggio sono presenti due registri in cui due scrutatori, ognuno incaricato di gestire un registro,
  6.  * riportano le presenze dei votanti recatisi alle urne: un registro per gli uomini e uno per le donne.
  7.  * Nel seggio inoltre sono allestite tre cabine in cui gli elettori hanno la possibilita' di esercitare
  8.  * il voto in riservatezza e l’urna in cui depositare la scheda.
  9.  * Un votante si presenta al seggio e aspetta che lo scrutatore che gestisce l’appropriato registro lo facci entrare;
  10.  * lo scrutatore dara' il permesso se non e' impegnato con un altro votante da registrare e almeno una delle cabine
  11.  * e' libera.
  12.  * Dopo esser stato registrato il votante si reca in una cabina ed esce dopo aver annullato la scheda;
  13.  * Quindi deposita la scheda nell’urna appena questa e' libera e poi lascia il seggio.
  14.  * Scrivere l’applicazione di simulazione del seggio in linguaggio C usando la libreria pthread nella ipotesi che
  15.  * al seggio siano iscritti 1000 elettori tra uomini e donne, e che questi si recano a votare in tempi casuali.
  16.  *
  17.  */
  18.  
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <pthread.h>
  22. #include <semaphore.h>
  23.  
  24. // Semafori necessari
  25. sem_t cabine; // Cabine libere, inizializza a 3
  26. sem_t sincronizzam; // Dai il consenso al votante (m), inizializza a 0
  27. sem_t sincronizzaf; // Dai il consenso al votante (f), inizializza a 0
  28. sem_t urna; // Un solo votante alla volta può inserire nell'urna, inizializza a 1
  29. sem_t liberom; // Semaforo che indica la condizione libera o no dello scrutatore
  30. sem_t liberof;
  31.  
  32. // Prototipi funzioni
  33. void vaiincabinaevota();
  34. void votoinurna();
  35. void* scrutatorem();
  36. void* scrutatoref();
  37. void* genericovotante();
  38.  
  39. int main(int argc, char const *argv[]){
  40.     pthread_t tid;
  41.     // Inizializzo semafori e avvio nuovi thread
  42.     sem_init(&cabine, 0, 3);
  43.     sem_init(&sincronizzam, 0, 0);
  44.     sem_init(&sincronizzaf, 0, 0);
  45.     sem_init(&urna, 0, 1);
  46.     sem_init(&liberom, 0, 1);
  47.     sem_init(&liberof, 0, 1);
  48.     // Random seed
  49.     srand(time(NULL));
  50.     pthread_create(&tid, NULL, scrutatorem, NULL);
  51.     pthread_create(&tid, NULL, scrutatoref, NULL);
  52.     for(int i=0; i<1000; ++i){
  53.         pthread_create(&tid, NULL, genericovotante, NULL);
  54.     }
  55.     return 0;
  56. }
  57.  
  58. void* scrutatorem(){
  59.     while(1){
  60.         // Sto già servendo qualcuno?
  61.         sem_wait(&liberom);
  62.         // La cabina è libera?
  63.         sem_wait(&cabine);
  64.         // Ok posso accordare il permesso di entrare a chi lo chiede
  65.         sem_post(&sincronizzam);
  66.     }
  67.  
  68. }
  69.  
  70. void* scrutatoref(){
  71.     sem_wait(&liberof);
  72.     sem_wait(&cabine);
  73.     sem_post(&sincronizzaf);
  74. }
  75.  
  76. // Serve for per chiamare 1000 volte f. genericovotante()
  77. void* genericovotante(){
  78.     int sesso = rand()%2; // ~50% prob. m o f
  79.     switch (sesso){
  80.         case 0:
  81.             sem_wait(&sincronizzam);
  82.             break;
  83.         case 1:
  84.             sem_wait(&sincronizzaf);
  85.             break;
  86.     }
  87.     // Mi registro presso lo scrutatore
  88.     sem_post(&liberom); // Lo scrutatore mi ha accordato il permesso di entrare e mi ha registrato, ora è libero
  89.     vaiincabinaevota();
  90.     sem_post(&cabine); // La cabina è libera
  91.     sem_wait(&urna); // Metto il voto nell'urna se è libera
  92.     votoinurna();
  93.     return NULL;
  94. }
RAW Paste Data