C 中的分段错误(核心转储) - 使用 PTHREADS 时

乔治·尼基塔斯

大家好,我的代码有问题,我不知道如何解决(分段错误(核心转储))!

所以我的老师要我写一个程序来创建 N 个踏板并让它们做一些计算。我有 3 个全局二维数组 A、B、C(我将它们作为指针,因为我不知道大小,用户将其作为参数)。我尝试在主函数中为它们分配内存。

所以问题是当我尝试在“pthread_create(&tid[id],NULL,add,(void *)(long) i);”中创建踏板时出现分段错误 :(。我不知道为什么会这样。我尝试使用 gdb 命令,但结果是问题出在 pthread_create 中。

但是,当我发表评论时,数组(A,B,C)和它们使用的 malloc 是运行的(但最终结果是 0)。

我正在使用一个虚拟盒子(如果有帮助,里面有 Ubuntu :D)。

以下代码是我到目前为止所写的:

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

long int p,N,Total_Sum;
long int **A,**B,**C;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_barrier_t bar;

void * add(void *arg){

    long int i,j,Local_Sum=0;
    long int lines,start,end,id;

    id = (long int)arg;
    lines = N/p;
    start = id*lines;
    end = start+lines;

    for(i=start;i<end;i++){
        for(j=0;j<N;j++){
            A[i][j] = 1;
            B[i][j] = 1;
        }
    }
    for(i=start;i<end;i++){
        for(j=0;j<N;j++){
            C[i][j] = A[i][j] * B[i][j];
            Local_Sum += C[i][j];
            printf("C[%ld][%ld] = %ld\n",i,j,C[i][j]);
        }
    }
    pthread_mutex_lock(&mutex);
    Total_Sum += Local_Sum;
    pthread_mutex_unlock(&mutex);
    pthread_barrier_wait(&bar);
    pthread_exit(0);
}

int main(int argc, char *argv[]){

    long int i,j,id;
    pthread_t *tid;
    if(argc!=3){
        printf("Provide Number Of Threads And Size\n");
        exit(1);
    }
    p = atoi(argv[1]);
    tid = (pthread_t *) malloc(p*sizeof(pthread_t));
    if(tid == NULL){
        printf("Could Not Allocate Memory\n");
        exit(1);
    }

    pthread_barrier_init(&bar,NULL,p);

    N = atoi(argv[2]);
    A = (long int**) malloc(N*sizeof(long int*));
    B = (long int**) malloc(N*sizeof(long int*));
    C = (long int**) malloc(N*sizeof(long int*));

    for(i=0;i<N;i++){
        A[i] = (long int*) malloc(N*sizeof(long int));
        B[i] = (long int*) malloc(N*sizeof(long int));
        C[i] = (long int*) malloc(N*sizeof(long int));
    }

    if((A==NULL) || (B == NULL) || (C == NULL)){
        printf("Count Not Allocate Memory\n");
        exit(1);
    }

    for(i=0;i<p;i++){
        pthread_create(&tid[id],NULL,add,(void *)(long) i);
    }
    for(i=0;i<p;i++){
        pthread_join(tid[id],NULL);
    }

    for(i=0;i<N;i++){
        free(A[i]);
        free(B[i]);
        free(C[i]);
    }
    free(A);
    free(B);
    free(C);

    printf("Final Result Is Equal To: %ld\n",Total_Sum);

    return 0;
}

******我知道它会因为互斥锁和障碍而变得有点混乱,但请向我询问进一步的规范:D.******

谢谢!!!!!!

亚历山大·帕内

我认为唯一的问题是以下几行中的索引:

for(i=0;i<p;i++){
    pthread_create(&tid[id],NULL,add,(void *)(long) i);
}
for(i=0;i<p;i++){
    pthread_join(tid[id],NULL);
}

id 仅被声明,但从未初始化!也许这只是一个错字,你想i用作索引tid

解决方法应该是:

for(i=0;i<p;i++){
    pthread_create(&tid[i],NULL,add,(void *)(long) i);
}
for(i=0;i<p;i++){
    pthread_join(tid[i],NULL);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用 fscanf 时 C 中的分段错误(核心转储)

使用动态2D数组时的C ++分段错误(核心转储)

在C中使用getchar()时出现分段错误(核心转储)?

使用 apt 升级时出现分段错误(核心转储)

在 C、Linux 中递归列出目录和文件时出现分段错误(核心转储)

使用C从核心转储获取导致分段错误的地址

C 中的分段错误(核心转储)

尝试将浮点数读入 C++ 中的链表时出现分段错误(核心转储)

如何在读取文件时修复 C++ 上的分段错误(核心转储)错误?

使用C30编译器在MPLABX中编译项目时出现Segmentaion Fault(核心转储)错误

使用ctypes传递2d numpy数组时出现分段错误(核心转储)

使用 pthread_create 时出现“分段错误(核心转储)”

使用ffmpeg并指定开始时间时出现分段错误(核心转储)

在分配了new []的阵列上使用avx时出现分段错误(核心转储)

尝试使用 (char**)malloc() 分配内存时出现分段错误(核心转储)

如何修复C中的分段错误(核心转储)错误

分段错误:C中的核心转储错误

错误:分段错误,核心转储,在 c 编程中

在 C 程序中接收分段错误(核心转储)

C程序中的分段错误(核心转储)以制作直方图

C 代码中的分段错误(核心转储)

使用pthreads的分段错误

在C中使用free()时,无效(中止)核心转储错误

C - 获取分段错误(核心转储)

C ++:分段错误(核心转储)问题

分段错误(核心转储)C ++-指针

分段错误(核心转储)C++

分段错误(核心转储)C

使用2d数组时,为什么我的程序中出现分段错误(核心转储)错误?