这段代码中出现分段错误的原因是什么?

问题描述

我将其编码为通过多线程将 2 个矩阵相乘,它从用户那里获取每个矩阵的行和列,并随机创建两个矩阵。这是我第一次遇到分段错误,我搜索了很多关于分段错误发生的原因,但我无法解决这个问题。现在我需要你的想法,我应该怎么做。我通过 gdb 调试了每一行代码,并且在第 89 行出现分段错误,如下所示:

**[New Thread 0x7ffff7dca700 (LWP 7323)] [New Thread 0x7ffff75c9700 (LWP 7324)] [New Thread 0x7ffff6dc8700 (LWP 7325)] [New Thread 0x7ffff65c7700 (LWP 7326)] Thread 1 "test" received signal SIGSEGV,Segmentation fault. 0x00007ffff7f9d297 in __pthread_clockjoin_ex (threadid=8,thread_return=0x0,clockid=0,abstime=0x0,block=true)
        at pthread_join_common.c:89 89      pthread_join_common.c: No such   file or directory.**

代码是:




    #include <pthread.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <time.h>
    
    #define MAT_SIZE 10
    #define MAX_THREADS 100
    
    int r1,c1,r2,c2,c,k,d;           //Parameters For Rows And Columns
    int matrix1[MAT_SIZE][MAT_SIZE]; //First Matrix
    int matrix2[MAT_SIZE][MAT_SIZE]; //Second Matrix
    int result [MAT_SIZE][MAT_SIZE]; //Multiplied Matrix
    
    //Type Defining For Passing Function Argumnents
    typedef struct parameters {
    int x,y;
    }args;
    
    int random_num() {
    return rand() % 10;
    }

解决方法

当前的问题是您所有的线程都设置了

pthread_create(&thread[thread_number],...

where thread_number 没有变化,所以线程句柄都被覆盖了最后吧。当你尝试清理

pthread_join(thread[z],NULL);

对于 z=0 .. z<thread_number,您排除了您实际初始化的唯一线程句柄。

其他问题是:

  • 问题包括大量不相关的交互式输入代码,重现问题是不可能的

    将代码减少到重现问题所需的最低限度是理解问题的重要一步,即使您最终没有将其发布到网上。

  • 它使用全局变量而不是线程参数(设置然后忽略)

    减少或避免使用共享全局变量 - 特别是在多线程代码中 - 通过限制可能发生突变的位置数量,使生活变得更加轻松。发布的代码将有多个线程试图覆盖相同的结果。

  • 缩进无处不在

    正确缩进代码可以让代码更容易阅读(对每个人来说),也更容易发现错误。