[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