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