Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema con los mutex en C.

Estas en el tema de Problema con los mutex en C. en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 31/05/2007, 12:28
 
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!
  #2 (permalink)  
Antiguo 31/05/2007, 19:23
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 17 años, 11 meses
Puntos: 28
Re: Problema con los mutex en C.

Si estas creando una matriz de mutex, ¿no deberias inicializar cada elemento de la matriz?

Además, estan inicializando el elemento [9][9] de la matriz que tiene indices que van de 0 a 8.

Saludos
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:34.