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>