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