Es un código muy simple para ver el funcionamiento de los semaforos.<div><br></div><div>No se que hago mal.</div><div><br></div><div><div>#include <pthread.h></div><div>#include <stdio.h></div><div>#include <stdlib.h></div>
<div>#include <unistd.h></div><div>#include <semaphore.h></div><div><br></div><div>int suma_total = 0;</div><div>sem_t mutex;</div><div>void * suma_parcial(void * arg) {</div><div> int temp_sem;</div><div> int j = 0;</div>
<div> int tmp = 0;</div><div> int ni=((int*)arg)[0];</div><div> int nf=((int*)arg)[1];</div><div><br></div><div> for (j = ni; j <= nf; j++){</div><div> tmp=tmp+j;</div><div> sched_yield();</div><div> sem_wait(&mutex);</div>
<div> suma_total = tmp;</div><div> sem_post(&mutex);</div><div> }</div><div> pthread_exit(0);</div><div>}</div><div><br></div><div>int main(void) {</div><div> pthread_t th1, th2;</div><div> int num1[2]={ 1, 4999};</div>
<div> int num2[2]={5000, 10000};</div><div> sem_init(&mutex, 0, 1);</div><div><br></div><div> /* se crean dos threads con atributos por defecto */</div><div> pthread_create(&th1, NULL, suma_parcial, (void*)num1);</div>
<div> pthread_create(&th2, NULL, suma_parcial, (void*)num2);</div><div><br></div><div> printf("El thread principal continua ejecutando\n");</div><div><br></div><div> /* se espera su terminacion */</div><div>
pthread_join(th1, NULL);</div><div> pthread_join(th2, NULL);</div><div> sem_destroy(&mutex);</div><div><br></div><div> printf("La suma total es: %d y debería ser (50005000)\n", suma_total);</div><div><br>
</div><div> return 0;</div><div>}</div></div><div><br></div><div>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.</div>