Retroceder   Foros del Web > Temas generales de computación > Programación > C/C++

Respuesta
 
Herramientas Desplegado
Antiguo 31-may-2007, 12:28   #1 (permalink)
Riskbreaker ha deshabilitado el karma
 
Fecha de Ingreso: enero-2005
Mensajes: 10
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!
Riskbreaker está desconectado   Responder Citando
Antiguo 31-may-2007, 19:23   #2 (permalink)
_Lucifer_ tiene algunos puntos positivos de karma
 
Avatar de _Lucifer_
 
Fecha de Ingreso: junio-2006
Mensajes: 1.588
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:
_Lucifer_ está desconectado   Responder Citando
Respuesta

No hay votos aún.


Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder temas
No puedes subir archivos adjuntos
No puedes editar tus mensajes

BB code is Activado
Caritas están Activado
[IMG] está Activado
Código HTML está Desactivado


La Zona horaria es GMT -6. Ahora son las 15:42.


Message Board Statistics

LinkBacks Enabled by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93