es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Segmentación de fallos de segmento en threads

Este es un programa hecho en C que se compila correctamente usando gcc filename.c -o file -pthread. Sin embargo, cuando ejecuto el programa, me muestra un error de segmentación y no estoy seguro de cómo solucionarlo. Este programa tiene como objetivo generar números enteros aleatorios en una matriz y luego comparar cuánto tiempo se tarda en encontrar los 10 números más grandes y los 10 números más pequeños utilizando una cantidad diferente de hilos para cada iteración del programa.

“`c

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

#define arraySize 10000
#define lval 0
#define hval 50000
#define maxthread 100

int num[arraySize];
int maxs[maxthread];
int mins[maxthread];
int threadsize;
int threadnum = 0;

void fill(){
int i;
int tmp[hval];
for(i = lval;i < hval;i++)tmp[i] = i;
for(i = 0;i < arraySize;i++){
int t= i + rand()%(hval – 1);
int temp = tmp[i];
tmp[i] = tmp[t];
tmp[t] = temp;
num[i] = tmp[i];
}
}

void print(){
int i;
printf("Los primeros 10 números son: \n");
for(i = 0;i < 10;i++)printf("\t%d\n",num[i]);
printf("\n\nÚltimos 10 números: \n");
for(i = (arraySize – 10);i < arraySize;i++)printf("\t%d\n",num[i]);
}

void <em>getminmax(void *arg){
int i,n = threadnum++;
int max = lval,min = hval;
for(i = n</em>(arraySize / threadsize);i < (n + 1)*(arraySize / threadsize);i++){
if (num[i] > max)max = num[i];
if (num[i] < min)min = num[i];
}
maxs[n] = max;
mins[n] = min;
printf("Hilos:%d Min: %d Max%d Número de hilo: %d\n",threadsize,min,max,n);
}

void search(){
int max = lval, min = hval;
int i;
int start = clock();
pthread_t threads[threadsize];
for(i = 0;i < threadsize;i++)
pthread_create(&threads[i],NULL,getminmax,(void*)NULL);
for(i = 0;i < threadsize;i++)
pthread_join(threads[i],NULL);
for(i = 0;i < threadsize;i++){
if(maxs[i] > max)max = maxs[i];
if(mins[i] < min)min = mins[i];
}
int end = clock();
int d = end – start;
printf("Hilos %d Min: %d Tiempo transcurrido: %d \n\n",threadsize,min,max,d);
}

int main(){
fill();
print();
threadsize = 2;
threadnum = 0;
search();
threadsize = 10;
threadnum = 0;
search();
threadsize = 100;
threadnum = 0;
search();
return 0;
}
“`</time.h></pthread.h></stdlib.h></stdio.h>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El error de violación de segmento puede ocurrir debido a que se accede a un índice fuera de los límites del arreglo. En este programa, los arreglos maxs[maxthread] y mins[maxthread] tienen un tamaño fijo de maxthread, que está definido como 100. Sin embargo, no se verifica el tamaño del arreglo antes de acceder a los elementos del mismo.

    Cuando el programa se ejecuta con un alto número de hilos, n puede exceder el tamaño de los arreglos maxs y mins, lo que resulta en una violación de segmento. Para solucionar este error, se recomienda verificar el tamaño del arreglo antes de acceder a los elementos del mismo.

    Una forma de solucionar esto es definir maxs y mins dinámicamente utilizando malloc en función de la variable threadsize. Esto asignará memoria en función del número de hilos utilizados y evitará el acceso fuera de límites del arreglo.

    int *maxs, *mins;
    maxs = (int*)malloc(sizeof(int)*threadsize);
    mins = (int*)malloc(sizeof(int)*threadsize);
    

    Y también, recuerda liberar la memoria asignada dinámicamente al final del programa.

    free(maxs);
    free(mins);
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    #include <time.h>
    
    #define arraySize 10000
    #define lval 0
    #define hval 50000
    #define maxthread 100
    
    int num[arraySize];
    int threadsize;
    int threadnum = 0;
    
    void fill(){
        int i;
        int tmp[hval];
        for(i = lval; i < hval; i++) tmp[i] = i;
        for(i = 0; i < arraySize; i++){
            int t= i + rand()%(hval - 1);
            int temp = tmp[i];
            tmp[i] = tmp[t];
            tmp[t] = temp;
            num[i] = tmp[i];
        }
    }
    
    void print(){
        int i;
        printf("Los primeros 10 números son: \n");
        for(i = 0; i < 10; i++) printf("\t%d\n", num[i]);
        printf("\n\nLos últimos 10 números son: \n");
        for(i = (arraySize - 10); i < arraySize; i++) printf("\t%d\n", num[i]);
    }
    
    void *getminmax(void *arg){
        int i,n = threadnum++;
        int *maxs, *mins;
        maxs = (int*)malloc(sizeof(int)*threadsize);
        mins = (int*)malloc(sizeof(int)*threadsize);
        int max = lval, min = hval;
        for(i = n*(arraySize / threadsize); i < (n + 1)*(arraySize / threadsize); i++){
            if (num[i] > max) max = num[i];
            if (num[i] < min) min = num[i];
        }
        maxs[n] = max;
        mins[n] = min;
        printf("Hilos:%d Min: %d Max%d Número de hilo: %d\n", threadsize, min, max, n);
        free(maxs);
        free(mins);
    }
    
    void search(){
        int max = lval, min = hval;
        int i;
        int start = clock();
        pthread_t threads[threadsize];
        for(i = 0; i < threadsize; i++)
            pthread_create(&threads[i], NULL, getminmax, (void*)NULL);
        for(i = 0; i < threadsize; i++)
            pthread_join(threads[i], NULL);
        for(i = 0; i < threadsize; i++){
            if(maxs[i] > max) max = maxs[i];
            if(mins[i] < min) min = mins[i];
        }
        int end = clock();
        int d = end - start;
        printf("Hilos %d Min: %d Tiempo tomado: %d \n\n", threadsize, min, max, d);
    }
    
    int main(){
        fill();
        print();
        threadsize = 2;
        threadnum = 0;
        search();
        threadsize = 10;
        threadnum = 0;
        search();
        threadsize = 100;
        threadnum = 0;
        search();
        return 0;
    }
    

    Nota: Este código ha sido editado para solucionar el error de violación de segmento, pero puede haber otros problemas en el programa que puedan afectar su rendimiento.</time.h></pthread.h></stdlib.h></stdio.h>

Comments are closed.