Código:
La función "rellenar" no tiene nada que ver con mi problema, simplemente se encarga de decidir de manera aleatoria si el sudoku está bien o no. Más que nada es preguntar si alguien puede explicarme cómo debería acceder a una posición concreta de la matriz de mutex para bloquearle y desbloquearlas después ^^.#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <memory.h> #include <pthread.h> #include <semaphore.h> #include <time.h> int sudoku [9][9]; void *imprime_sudoku(void *arg); int *juez(int sudoku[9][9]); void *rellenar(void *arg); void *validar(void *arg); sem_t a,b,c,d; int correcto=0; pthread_mutex_t mutex [9][9]; void *rellenar(void *arg){ int *id; id=(int *)arg; while(correcto==0){ int contador=0; int i,j; while(contador<27){ i=rand()%9+1; j=rand()%9+1; pthread_mutex_lock(&mutex[i][j]); /*Éste debe de ser uno de los problemas.*/ if (sudoku[i][j]==0){ sudoku[i][j]=(rand()%9)+1; contador=contador+1; printf("El jugador %d ha rellenado la casilla [%d][%d] con el valor %d\n",*id,i,j,sudoku[i][j]); usleep(1); } pthread_mutex_unlock(&mutex[i][j]); /*Y éste otro ^^U.*/ } sem_post(&a); if (*id==1) sem_wait(&b); if (*id==2) sem_wait(&c); if (*id==3) sem_wait(&d); } void pthread_exit(); } void *validar(void *arg){ while(correcto==0){ sem_wait(&a); sem_wait(&a); sem_wait(&a); int aleatorio; aleatorio=rand()%9+1; int i,j; printf("\n"); for(i=1;i<10; i++){ for (j=1; j<10; j++){ printf (" %d ",sudoku[i][j]); } printf("\n"); } printf("\n"); if (aleatorio<5) { correcto=0; for(i=1;i<10; i++){ for (j=1; j<10; j++){ sudoku[i][j]=0; } } printf("El juez dictamina que el sudoku es incorrecto\n"); } else { correcto=1; printf("El juez dictamina que el sudoku es correcto y termina la ejecución\n"); } sem_post(&b); sem_post(&c); sem_post(&d); } void pthread_exit(); } main(){ pthread_mutex_init(&mutex[9][9],NULL); srand(time(NULL)); sem_init(&a,0,0); sem_init(&b,0,0); sem_init(&c,0,0); sem_init(&d,0,0); pthread_t persona1, persona2, persona3, juez; int aux1=1, aux2=2, aux3=3; pthread_create(&persona1,NULL,rellenar, (void*) &aux1); pthread_create(&persona2,NULL,rellenar, (void*) &aux2); pthread_create(&persona3,NULL,rellenar, (void*) &aux3); pthread_create(&juez,NULL,validar, (void*) &juez); pthread_join(juez,NULL); pthread_join(persona1,NULL); pthread_join(persona2,NULL); pthread_join(persona3,NULL); sem_destroy(&a); sem_destroy(&b); sem_destroy(&c); sem_destroy(&d); }
Mil gracias por adelantado y un saludo a todos!