【问题标题】:Getting a segmentation fault (core dumped) when printing elements of an array (Using pthreads)打印数组元素时出现分段错误(核心转储)(使用 pthreads)
【发布时间】:2021-06-15 11:57:35
【问题描述】:

所以我正在尝试使用线程(使用 pthread)进行存储桶排序。该程序尝试对从 0 到 999 的 3500 个整数进行排序并将它们划分为范围(此范围取决于线程数),因此如果有 4 个线程,一个线程将对数字从 0 到 250 进行排序,另一个线程将从 251 排序到 500 等等。

我试图创建一个函数,它返回一个仅包含每个线程范围内的数字的数组。这就是我在 pthread_create 中作为参数发送的函数。这是该函数和全局变量的代码:

int arreglo[3500];  //Array of 3500 random numbers
int elementosEnArregloTmp;  //Number of elements in each range
int num_Hilos;          //Number of threads
int elementos_Arreglo = 3500;   //3500
int tamanoRango;     //Size of range. 1000 / #OfThreads

    int *llenarElementosArreglo(int A[], int n){        
        int i,k=0;
        int *B = malloc(sizeof(int)*A[n]);
    for(i = 0; i < 3500; i++){
        if(n < num_Hilos-1){
            if(arreglo[i] >= tamanoRango*n && arreglo[i] < tamanoRango*(n+1)){
                B[k]=arreglo[i];
                k++;
            }
        }
        else if(arreglo[i] >= tamanoRango*n && arreglo[i] < 1000){
                B[k]=arreglo[i];
                k++;
            }
    }

    mostrarArreglo(B,A[n]); //Funcion que imprime el arreglo
    elementosEnArregloTmp = A[n];
    
    return B;
}

使用这个函数,我尝试创建一个动态数组,其元素的大小与 3500 个整数的主数组在每个特定范围内的元素大小相同(这就是数组 A[] 的用途),'n' 是线程该函数将返回包含范围内元素的数组。

当我只用 1、2 或 3 个线程运行程序时,我没有问题,它运行得很好,但是当我放置 4 个或更多线程时,我最终会遇到分段错误(核心转储)。我还注意到,在填充动态数组时不会发生分段错误,而是在最后调用打印数组元素的函数 (mostrarArreglo) 时发生。

几个小时以来我一直试图改变一些东西,但我无法解决这个问题。

我还要放一些主代码,虽然我不认为问题出在主代码中。

int main (int argc, char* argv[]){  
    ...
    ...
    pthread_t hilos[num_Hilos];     //Se declara que habran 5 hilos

    for(i = 0; i < num_Hilos; i++){ //Ciclo para crear los 5 hilos con su funcion que sera bucketSortPorHilo
            error = pthread_create(&hilos[i], NULL, bucketSortPorHilo, (void*)(llenarElementosArreglo(elementosPorRango,i)));     
            if(error){          
                    fprintf(stderr,"Error %d: %s\n", error, strerror (error));
                    exit (-1);
            }
            error = pthread_join(hilos[i], NULL);
            if(error) error_fatal(error, "pthread_join");
        }  
    return 0;   
}

【问题讨论】:

  • 'int *B = malloc(sizeof(int)*A[n]);'这看起来不对劲。 printf out A[n] here - 对于整数个数来说这是一个合理的值吗?
  • 感谢您的回答,我已经打印了 A[n] 并且对于该特定范围内的整数数量,它确实具有相同的值!我觉得很奇怪的是,该程序适用于 3 个或更少的线程,当使用更多线程时,它适用于一些线程和打印,之后我得到了分段错误。
  • 'elementosPorRango' 它在哪里声明和定义?无论如何都要为实际检查我怀疑的值投赞成票。实际上很少得到实际反馈:)
  • 谢谢!! 'elementosPorRango' 定义在主代码开头的部分,我没有放在这里的主代码部分,因为它只是很多 printf 之类的东西,这就是为什么我只展示了带有我在哪里创建线程!!

标签: c pthreads dynamic-arrays


【解决方案1】:

所以我不知道回答我自己的帖子是否有问题,但我解决这个问题的方法是返回一个包含数组(每个数字范围)的结构和一个包含数组元素数量的 int !!

【讨论】:

    猜你喜欢
    • 2020-08-15
    • 2022-01-14
    • 1970-01-01
    • 2018-11-02
    • 2020-04-21
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多