【发布时间】: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<r1;a++){ for(int a=0;a<c2;a++){很奇怪,你确定要在sum+= matrix1[p->x][a]*matrix2[a][p->y];中使用a的“正确版本”吗? -
好点:当内部
a的值为>= 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