emp3hack icon

esame-28-02-13 SO

emp3hack | PRO | 12/27/15 09:41:35 AM UTC | 0 ⭐ | 12129 👁️ | Never ⏰ | []
C for Macs |

0 B

|

None

|

0 👍

/

0 👎

/* Esame del 28/02/13
 * 
 * Siamo in periodo di elezioni e si vuole avere un programma che simuli il comportamento
 * degli elettori al seggio elettorale. 
 * Nel seggio sono presenti due registri in cui due scrutatori, ognuno incaricato di gestire un registro, 
 * riportano le presenze dei votanti recatisi alle urne: un registro per gli uomini e uno per le donne.
 * Nel seggio inoltre sono allestite tre cabine in cui gli elettori hanno la possibilita' di esercitare
 * il voto in riservatezza e l’urna in cui depositare la scheda.
 * Un votante si presenta al seggio e aspetta che lo scrutatore che gestisce l’appropriato registro lo facci entrare;
 * lo scrutatore dara' il permesso se non e' impegnato con un altro votante da registrare e almeno una delle cabine
 * e' libera.
 * Dopo esser stato registrato il votante si reca in una cabina ed esce dopo aver annullato la scheda;
 * Quindi deposita la scheda nell’urna appena questa e' libera e poi lascia il seggio.
 * Scrivere l’applicazione di simulazione del seggio in linguaggio C usando la libreria pthread nella ipotesi che
 * al seggio siano iscritti 1000 elettori tra uomini e donne, e che questi si recano a votare in tempi casuali.
 *
 */
 
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
 
// Semafori necessari
sem_t cabine; // Cabine libere, inizializza a 3
sem_t sincronizzam; // Dai il consenso al votante (m), inizializza a 0
sem_t sincronizzaf; // Dai il consenso al votante (f), inizializza a 0
sem_t urna; // Un solo votante alla volta può inserire nell'urna, inizializza a 1
sem_t liberom; // Semaforo che indica la condizione libera o no dello scrutatore
sem_t liberof;
 
// Prototipi funzioni
void vaiincabinaevota();
void votoinurna();
void* scrutatorem();
void* scrutatoref();
void* genericovotante();
 
int main(int argc, char const *argv[]){
    pthread_t tid;
    // Inizializzo semafori e avvio nuovi thread
    sem_init(&cabine, 0, 3);
    sem_init(&sincronizzam, 0, 0);
    sem_init(&sincronizzaf, 0, 0);
    sem_init(&urna, 0, 1);
    sem_init(&liberom, 0, 1);
    sem_init(&liberof, 0, 1);
    // Random seed
    srand(time(NULL));
    pthread_create(&tid, NULL, scrutatorem, NULL);
    pthread_create(&tid, NULL, scrutatoref, NULL);
    for(int i=0; i<1000; ++i){
        pthread_create(&tid, NULL, genericovotante, NULL);
    }
    return 0;
}
 
void* scrutatorem(){
    while(1){
        // Sto già servendo qualcuno?
        sem_wait(&liberom);
        // La cabina è libera?
        sem_wait(&cabine);
        // Ok posso accordare il permesso di entrare a chi lo chiede
        sem_post(&sincronizzam);
    }
 
}
 
void* scrutatoref(){
    sem_wait(&liberof);
    sem_wait(&cabine);
    sem_post(&sincronizzaf);
}
 
// Serve for per chiamare 1000 volte f. genericovotante()
void* genericovotante(){
    int sesso = rand()%2; // ~50% prob. m o f
    switch (sesso){
        case 0:
            sem_wait(&sincronizzam);
            break;
        case 1:
            sem_wait(&sincronizzaf);
            break;
    }
    // Mi registro presso lo scrutatore
    sem_post(&liberom); // Lo scrutatore mi ha accordato il permesso di entrare e mi ha registrato, ora è libero
    vaiincabinaevota();
    sem_post(&cabine); // La cabina è libera
    sem_wait(&urna); // Metto il voto nell'urna se è libera
    votoinurna();
    return NULL;
}

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

    |

    👍

    /

    👎