[C con Clase] problemas con semaforos.
alvaro martin garcia
purifuri en gmail.com
Lun Mar 26 16:46:44 CEST 2012
Es un código muy simple para ver el funcionamiento de los semaforos.
No se que hago mal.
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <semaphore.h>
int suma_total = 0;
sem_t mutex;
void * suma_parcial(void * arg) {
int temp_sem;
int j = 0;
int tmp = 0;
int ni=((int*)arg)[0];
int nf=((int*)arg)[1];
for (j = ni; j <= nf; j++){
tmp=tmp+j;
sched_yield();
sem_wait(&mutex);
suma_total = tmp;
sem_post(&mutex);
}
pthread_exit(0);
}
int main(void) {
pthread_t th1, th2;
int num1[2]={ 1, 4999};
int num2[2]={5000, 10000};
sem_init(&mutex, 0, 1);
/* se crean dos threads con atributos por defecto */
pthread_create(&th1, NULL, suma_parcial, (void*)num1);
pthread_create(&th2, NULL, suma_parcial, (void*)num2);
printf("El thread principal continua ejecutando\n");
/* se espera su terminacion */
pthread_join(th1, NULL);
pthread_join(th2, NULL);
sem_destroy(&mutex);
printf("La suma total es: %d y debería ser (50005000)\n", suma_total);
return 0;
}
Asi es como lo tenia al principio, he quitado algunas líneas que he usado a
modo de depuración, he comprobado que dentro de la zona crítica el valor es
0 y fuera el valor es 1.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20120326/55846242/attachment.html>
Más información sobre la lista de distribución Cconclase