问题描述
我将其编码为通过多线程将 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
,您排除了您实际初始化的唯一线程句柄。
其他问题是:
-
问题包括大量不相关的交互式输入代码,重现问题是不可能的
将代码减少到重现问题所需的最低限度是理解问题的重要一步,即使您最终没有将其发布到网上。
-
它使用全局变量而不是线程参数(设置然后忽略)
减少或避免使用共享全局变量 - 特别是在多线程代码中 - 通过限制可能发生突变的位置数量,使生活变得更加轻松。发布的代码将有多个线程试图覆盖相同的结果。
-
缩进无处不在
正确缩进代码可以让代码更容易阅读(对每个人来说),也更容易发现错误。