[C con Clase] problemas con semaforos.
José Luis Torre
joseluistorrehernandez en gmail.com
Mar Mar 27 13:00:31 CEST 2012
El argumento 0 es el nombre del programa.
Saludos
José Luis
El día 26 de marzo de 2012 16:46, alvaro martin garcia
<purifuri en gmail.com> escribió:
> 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.
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
--
José Luis Torre
ww.ehu.es
Más información sobre la lista de distribución Cconclase