/* 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 #include #include #include // 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; }