/* Cree el programa "democracia.c" para simular el conteo de votos en una elección. Democracia.c recibe dos argumentos enteros E1 y E2 como en: $ democracia 100 500 * E1 = 100, E2 = 500. * Se tiene una hebra Th1 que genera y procesa los votos de la elección de un cargo para el cual hay 2 candidatos A y B. Hay un contador de preferencias por cada candidato. Por simplicidad no hay nulos ni blancos. Desarrollo el programa democracia2.c en el cual Th2 actualiza el resultado mostrado por pantalla tan pronto se ha procesado otro voto. En este caso se omite el segundo parámetro E2 y se debe evitar estados de espera ocupado (Busy Wait). $ gcc -o democracia2 -pthread democracia2.c */ #include #include /* drand48() */ #include /* usleep */ #include int votos_A=0; int votos_B=0; pthread_mutex_t mylock = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t votesChange = PTHREAD_COND_INITIALIZER; void * showResult(void * arg) { float a, b; while (1) { pthread_mutex_lock(&mylock); pthread_cond_wait(&votesChange, &mylock); a = (float)votos_A/(votos_A+votos_B); pthread_mutex_unlock(&mylock); b = 1-a; printf("A: %f % b: %f %\n", 100*a, 100*b); } } int main(int argc, char * argv[]) { int err, e1, i; double r; pthread_t tid; e1 = 1000*atoi(argv[1]); err = pthread_create(&tid, NULL, showResult, NULL); if (err != 0){ printf("can't create thread \n"); exit(0); } for (i = 0; i < 50; i++){ r = drand48(); pthread_mutex_lock(&mylock); if ( r < 0.4) votos_A++; else votos_B++; pthread_mutex_unlock(&mylock); pthread_cond_signal(&votesChange); usleep(e1); } }