C 多线程初始化中的未知分段错误(内核转储)

C 多线程初始化中的未知分段错误(内核转储),c,multithreading,segmentation-fault,semaphore,C,Multithreading,Segmentation Fault,Semaphore,我有三个不同的实验室助教查看我的代码,但没有一个能够帮助我,所以我决定在这里尝试。除非我删除与gettimeofday和任何信号量相关的所有代码,否则我会得到一个“分段错误(核心转储)​" 错误。我已将代码简化为仅包含简单声明的主线程,以试图找到问题的根源 我的代码: #include <pthread.h> #include <semaphore.h> #include <sys/types.h> #include <stdio.h> #incl

我有三个不同的实验室助教查看我的代码,但没有一个能够帮助我,所以我决定在这里尝试。除非我删除与gettimeofday和任何信号量相关的所有代码,否则我会得到一个“分段错误(核心转储)​" 错误。我已将代码简化为仅包含简单声明的主线程,以试图找到问题的根源

我的代码:

#include <pthread.h>
#include <semaphore.h>
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <sys/shm.h>
#include <sys/time.h>  

void *threadN (void *); /* thread routines */

pthread_t tid[1]; /* array of thread IDs */

int main() 
{
    int i,j;
   /* here create and initialize all semaphores */ 
   int mutex = sem_create(777777, 1);

   int MatrixA[6000][3000];

   for (i=0; i < 6000; i++) {
       for (j=0; j < 3000; j++) {
           MatrixA[i][j]=i*j;
       }
   }
   int MatrixB[3000][1000];

   for (i=0; i < 3000; i++) {
       for (j=0; j < 1000; j++) {
           MatrixB[i][j]=i*j;
       }
   }

   int MatrixC[6000][1000];
   struct timeval tim;
   gettimeofday(&tim, NULL);
   float t1=tim.tv_sec+(tim.tv_usec/1000000.0);  
   gettimeofday(&tim, NULL);  
   float t2=tim.tv_sec+(tim.tv_usec/1000000.0);  
   printf("%.2lf seconds elapsed\n", t2-t1); 

   sem_rm(sem_open(777777, 1));
   return 0;
}​
#包括
#包括
#包括
#包括
#包括
#包括
#包括
void*线程n(void*);/*线程例程*/
pthread_t tid[1];/*线程ID数组*/
int main()
{
int i,j;
/*此处创建并初始化所有信号量*/
int mutex=sem_create(777777,1);
整数矩阵[6000][3000];
对于(i=0;i<6000;i++){
对于(j=0;j<3000;j++){
矩阵[i][j]=i*j;
}
}
int MatrixB[3000][1000];
对于(i=0;i<3000;i++){
对于(j=0;j<1000;j++){
矩阵x[i][j]=i*j;
}
}
int MatrixC[6000][1000];
结构时间间隔;
gettimeofday(&tim,NULL);
浮点数t1=定时电视秒+(定时电视秒/1000000.0);
gettimeofday(&tim,NULL);
浮动t2=定时电视秒+(定时电视秒/1000000.0);
printf(“%.2lf秒已过去\n”,t2-t1);
sem_rm(sem_open(777777,1));
返回0;
}​

我在这里完全被难住了。

我发现跟踪seg故障的一个有用方法是使用gdb

gcc -g -o a.out -c program.c
-g生成源代码级调试信息

gdb a.out core
这将启动带有a的gdb

(gdb) run

这将运行程序并显示seg故障发生的线路。

我发现跟踪seg故障的有用方法是使用gdb

gcc -g -o a.out -c program.c
-g生成源代码级调试信息

gdb a.out core
这将启动带有a的gdb

(gdb) run
这将运行程序并显示seg故障发生的线路。

您吃掉了堆栈。请参阅@Joachim Pileborg的评论:

本地变量通常存储在堆栈上,堆栈通常限制为一位数兆字节。例如,在Windows上,每个进程的默认值为1MB,在Linux上,默认值为8MB

我在Windows上尝试了你的代码,但它在定义为6000*3000*4(用于int)的MatrixA时死掉了

因此,您必须将矩阵数据移出堆栈:将矩阵定义为静态或在堆上分配。

您吃掉了堆栈。请参阅@Joachim Pileborg的评论:

本地变量通常存储在堆栈上,堆栈通常限制为一位数兆字节。例如,在Windows上,每个进程的默认值为1MB,在Linux上,默认值为8MB

我在Windows上尝试了你的代码,但它在定义为6000*3000*4(用于int)的MatrixA时死掉了


因此,您必须将矩阵数据移出堆栈:将矩阵定义为静态或在堆上分配。

您能解释一下您的代码试图做什么吗?当您输入某些值时,预期的输出是什么?如果没有这些信息,很难调试您的问题。在这一点上,代码做不了什么ng.这只是最终将使用多线程快速为数组赋值的开始,但在我达到这一点之前,我需要第一部分能够运行,而不需要简单地给出分段错误和其他任何东西。在这种情况下,您能否精确地缩小seg错误从哪一行抛出。C中的线程这是一个众所周知的棘手问题。只要我删除gettimeofday函数、浮点声明和信号量,故障就不会发生。如果其中任何一个被保留,我就会出现故障。代码在哪一行崩溃?你能解释一下你的代码试图做什么吗?当你输入certa时,预期的输出是什么在值中?如果没有这些信息,就很难调试您的问题。在这一点上,代码什么都做不了。这只是最终使用多线程将值快速分配给数组的开始,但在达到这一点之前,我需要第一节能够运行,而不需要简单地给出分段错误在这种情况下,你能准确地缩小seg错误抛出的行吗?C中的线程处理是一项众所周知的棘手的工作。只要我删除gettimeofday函数、浮点声明和信号量,错误就不会发生。如果其中任何一行被保留,我就会得到错误。代码在哪一行崩溃?t他根本没有回答这个问题。不过,它应该适合作为评论…GDB回答所有C调试问题!OP如果GDB不适合您,我建议运行“man sem_open”“我们可能有不同的版本,但sem_open的第一个参数是char*,因此,如果sem_open正在查看地址位置777777,则可能是潜在seg故障的来源。这根本无法回答问题。不过,它应该适合作为注释…GDB回答了所有C调试问题!OP如果GDB不适用于您,我建议运行“man sem_open”,我们可能有不同的版本,但sem_open的第一个参数是char*因此,如果它sem_open正在查看地址位置777777,则可能是seg故障的来源。