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

时间:2015-03-31 03:32:46

标签: c multithreading segmentation-fault semaphore

我有三个不同的实验室TA查看我的代码,但没有一个能够帮助我,所以我决定尝试一下。除非我删除所有与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;
}​

我完全被难住了。

2 个答案:

答案 0 :(得分:3)

你吃掉了你的筹码。请参阅Radix sort for 10^6 array in C,来自@Joachim Pileborg的评论:

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

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

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

答案 1 :(得分:1)

我发现用于跟踪seg故障的一个有用的事情是使用gdb。

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

-g生成源级调试信息

gdb a.out core

这会使用a.out

启动gdb
(gdb) run

这应运行程序并显示发生seg故障的行。