【问题标题】:what is the reason of getting segmentation fault in this code?这段代码中出现分段错误的原因是什么?
【发布时间】:2021-04-09 19:07:04
【问题描述】:

我将其编码为通过多线程将 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;
    }

【问题讨论】:

  • for(int a=0;a&lt;r1;a++){ for(int a=0;a&lt;c2;a++){ 很奇怪,你确定要在sum+= matrix1[p-&gt;x][a]*matrix2[a][p-&gt;y];中使用a的“正确版本”吗?
  • 好点:当内部a 的值为&gt;= r1 时,外部循环的a 将被忽略(阴影),导致索引可能超出范围。
  • 我解决了这个错误,但现在我收到了这个错误 [新线程 0x7ffff7dca700 (LWP 7323)] [新线程 0x7ffff75c9700 (LWP 7324)] [新线程 0x7ffff6dc8700 (LWP 7325)] [新线程 0x7ffff65c7700 (LWP 7326)] 线程 1“测试”收到信号 SIGSEGV,分段错误。 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: 没有这样的文件或目录。
  • @andkhoycoding 首先我不明白为什么您取消删除以删除几乎所有问题中的代码,现在您提供的代码绝对没有执行 => 在这种情况下不可能出现分段错误!第二,不能重用旧题,用Minimal, Complete, and Verifiable example开新题,目前绝对不是这样

标签: c multithreading segmentation-fault


【解决方案1】:

直接的问题是你所有的线程都设置了

pthread_create(&thread[thread_number], ...

其中thread_number不变,所以线程句柄都被覆盖了bar最后。当您尝试清理时

pthread_join(thread[z], NULL);

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

其他问题是:

  • 问题包括大量不相关的交互式输入代码,不可能需要这些代码来重现问题

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

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

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

  • 缩进无处不在

    正确缩进代码使(所有人)更容易阅读,也更容易发现错误。

【讨论】:

    猜你喜欢
    • 2019-10-23
    • 1970-01-01
    • 2010-10-19
    • 2013-06-16
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    相关资源
    最近更新 更多