多线程初始化中的Unknown Segmentation Fault (Core Dumped)

Unknown Segmentation Fault (Core Dumped) in multithread initialization

我已经让三个不同的实验室助教查看了我的代码,其中 none 能够帮助我,所以我决定在这里尝试。除非我删除与 gettimeofday 和任何信号量相关的所有代码,否则我会收到 "Segmentation fault (core dumped)​" 错误。我已将我的代码归结为只有带有简单声明的主线程,以试图找到问题的根源。

我的代码:

#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;
}​

我完全被难住了。

我发现使用 gdb 对跟踪段错误很有用。

gcc -g -o a.out -c program.c

-g 生成源代码级调试信息

gdb a.out core

这会用 a.out

启动 gdb
(gdb) run

这应该 运行 程序并显示发生段错误的行。

你吃了你的筹码。参见 ,@Joachim Pileborg 的评论:

局部变量通常存储在栈中,栈通常限制在个位数兆字节。例如,在 Windows 上,默认为每个进程 1MB,在 Linux 上,默认为 8MB...

我在 Windows 上尝试了你的代码,它只定义了 MatrixA 就死了:6000*3000*4(对于 int)...

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