Ver Mensaje Individual
  #1 (permalink)  
Antiguo 31/05/2007, 12:28
Riskbreaker
 
Fecha de Ingreso: enero-2005
Mensajes: 10
Antigüedad: 19 años, 4 meses
Puntos: 0
Problema con los mutex en C.

Saludos y muy buenas a todos ^^. Veréis, tengo que hacer una especie de sudoku en c, pero tiene que ser de forma concurrente. Me explico: se lanzan 3 threads que representan cada uno a una persona, y cada uno de ellos tiene que encargarse de rellenar 27 casillas del tablero del sudoku (es decir, un tercio del total). El problema es, que como la escritura ha de ser concurrente, la solución más lógica parece ser usar una matriz de mutex "asociada" a la matriz de números del sudoku, de modo que cuando una persona intente entrar a la casilla [i][j] del sudoku para poner un número, antes bloquea ésa misma casilla en la matriz de mutex, para así proteger la casilla y que a la vez las otras dos personas puedan escribir en otras casillas. Pero se ve que no conozco la sintaxis adecuada para trabajar con una matriz de mutex o algo, puesto que el programa se me "cuelga" al ejecutarlo (me rellena algunas casillas y luego se queda parado). Tengo aquí el código por si alguien es tan amable de explicarme cómo se trabaja con una matriz de mutex ^^:
Código:
#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);	


}
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 ^^.

Mil gracias por adelantado y un saludo a todos!