[ Foro de C ]

Threads en C URGENTE

05-Jun-2016 15:21
Sara Concepcion
1 Respuestas

Hola a todos los de la comunidad, me estoy iniciando en C, y uno de los ejercicios que estoy haciendo trata de realizar un parking.
Para ello, se que debo utilizar thread pero llevo unos cuantos días cambiando el código y siempre obtengo lo mismo en el terminal, segmentation fault: 11, supongo que es porque realiza acceso a memoria y esta, está llena o algo así.
Os agradecería muchísimo que solucionarais la parte del código que tengo mal. Un saludo :)



#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>

int **parking;
int plazas, plantas, coches, camiones, plazas_libres,i,j;
pthread_mutex_t mutex;
pthread_t *coches_h;
pthread_cond_t parking_libre;


void imprimir_parking(){
for(i = 0; i<plantas; i++){
printf("PLANTA:%d", i);
for(j = 0; j<plazas; j++){
printf("\t[%d]", parking[i][j] );
}
printf("\n");
}
printf("\n");
}


int aparcar(int mat){
int booleano = 0;
int plaza_i, planta_i;
for(i = 0; i<plantas; i++){
for(j = 0; j<plazas; j++){
if(parking[i][j] == 0){// Se supone que dicha plaza está vacía
parking[i][j] = mat; //Coche 1 a plaza 3 planta 2 por ejemplo
plaza_i = j;
planta_i = i;
plazas_libres --;
printf("ENTRADA: Coche %d aparca en la planta %d, plaza %d. Plazas Libres: %d\n", mat, planta_i, plaza_i, plazas_libres);
booleano = 1; //Ha encontrado plaza libre
return booleano;
}
}
}
return booleano;
}


void *añadir_coche(void *num){ //recibe un puntero a su "matricula"
int matricula = *(int*) num;
int numero;
//booleano = 0;
while (1){
pthread_mutex_lock(&mutex);
while(!(aparcar(matricula))){ //Bucle que te dice si se puede aparcar o no, mientras no; pues esperas (bucle diapositivas Consumidor)
pthread_cond_wait(&parking_libre, &mutex);//mientras este lleno no haré nada
}
imprimir_parking();
pthread_mutex_unlock(&mutex);

//Formato de Salida del Coche
numero = ((rand () % 6) + 1); //Se supone que es un numero entre 1 y 6
sleep(numero);//Espera ese tiempo en s
pthread_mutex_lock(&mutex);
for(i=0;i<plantas;i++){
for(j=0;i<plazas;j++){
if(parking[i][j] == matricula)
parking[i][j] = 0; // la plaza esté de nuevo libre
}
}
plazas_libres ++;
printf("SALIDA: Coche %d saliendo. Plazas Libres: %d\n", matricula, plazas_libres);
imprimir_parking();
pthread_cond_signal(&parking_libre);//Si sale un coche quiere decir que ya no está lleno seguro
pthread_mutex_unlock(&mutex);
sleep(5);
}//fin del while(1)
}

int main(int argc, char **argv){
int *arrayCoches;

if((argc < 2)||(argc > 5)){
fprintf(stderr, "Número de argumentos incorrecto\n");
}else if(argc == 2){
plazas = atoi(argv[1]);
plantas = 1;
coches = 7;
camiones = 0;
}else if(argc == 3){
plazas = atoi(argv[1]);
plantas = atoi(argv[2]);
coches = 7;
camiones = 0;
}else if(argc == 4){
plazas = atoi(argv[1]);
plantas = atoi(argv[2]);
coches = atoi(argv[3]);
camiones = 0;
}else{
plazas = atoi(argv[1]);
plantas = atoi(argv[2]);
coches = atoi(argv[3]);
camiones = atoi(argv[4]);
}


plazas_libres = (plazas*plantas);

// Reservar memoria para el parking
parking = (int**)malloc(plantas * sizeof(int*));
if(parking == NULL){
fprintf(stderr, "No hay suficiente espacio en la memoria para parking");
}
for(i = 0; i < plantas; i++){
parking[i] = (int*) malloc (sizeof(int) * plazas);
}
//Inicializamos el parking
for(i = 0; i < plantas; i++){
for(j = 0; j<plazas; j++){
parking[i][j] = 0;
}
}
printf("PLAZAS:%d\t", plazas);
printf("PLANTAS:%d\t", plantas);
printf("COCHES:%d\n", coches);
imprimir_parking();

//Tendremos tantos hilos como coches y camiones se tengan pero son dos hebras diferentes(Cliente, Productor) pues ahora es Camion y Coche
arrayCoches =  (int*) malloc(sizeof(int) * coches);
if(arrayCoches == NULL){
fprintf(stderr, "No hay suficiente espacio en la memoria para las matriculas");
}
for (i = 0; i<coches; i++){
arrayCoches[i] = i + 1;
}
coches_h = (pthread_t*) malloc(sizeof(pthread_t)*coches); // Tantos procesos como coches
if(coches_h == NULL){
fprintf(stderr, "No hay suficiente espacio en la memoria para los threads de Coches");
}

pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&parking_libre,NULL);

for(i = 0; i<coches; i++){
pthread_create(&coches_h[i], NULL, añadir_coche, &arrayCoches[i]);
/*1 argumento: variable donde se almacenará el id del hilo creado; 4: dirección de memoria que recibirá la funcion hilo como parametro
Como tenemos Coches = 20 pues debemos crear un array de 20 para que se almacenen sus respectivos ids al crear el thread.
*/
}

/*for(i=0;i<coches;i++){
pthread_join(coches_h[i],NULL);
}*/

pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&parking_libre);
free(arrayCoches);
free(parking);
free(coches_h);
return 0;
}


11-Jun-2016 11:24
Nacho Cabanes (+83)

Es mucho más habitual que se deba a un puntero nulo (que accedas a algo a lo que no hayas dado valor) que por llenar la memoria, y más en un equipo moderno, con tanta memoria disponible. Deberías depurar paso a paso, para ver en qué instrucción salta el error y comprobar si la variable que uses en esa instrucción están inicializada (que no lo estará).






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)