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!

