我不明白为什么下面的伪代码会导致段错误。

使用pthreads运行函数时,我遇到了SEGFAULT,将整数初始化为零。

my_threaded_function不在线程上下文中时,或者如果我从主线程调用了函数,则没有问题。

仅在rc=0;函数内部初始化maze_init bu时不会发生SEGFAULT。

我已经确认我的堆栈空间不足。但是我想不出是什么导致该函数在pthread内部行为不同(不涉及共享内存),根据gdb无法访问地址&aa

为什么堆栈变量的地址不在堆栈上?

int maze_init(Maze*m, char* filename)
{
   FILE *fp;
   int aa, bb, rc;
   aa = 0;              /// SEGFAULT HERE
   ...
   return 1;
}

void* my_threaded_function(void* arg)
{
   Maze maze;
   int rc;
   rc = 0;

   rc = maze_init(&maze,"test.txt");
   return rc;
   pthread_exit((void*)1);
}

int main(int argc,char** argv){
   pthread_t t;
   pthread_create(&t, NULL, my_threaded_function,(void*)0);
   sleep(10);
}



编辑(return rc的固定代码错字)

最佳答案

我已经确认我的堆栈空间不足。但是我想不到
  是什么导致函数在pthread中的行为不同


好吧,默认情况下,辅助线程的堆栈比“主”线程的堆栈小。您可以使用pthread_attr_setstacksize设置尺寸。

TLPI说:


  每个线程都有自己的堆栈,当线程为
  创建。在Linux / x86-32上,对于除主线程以外的所有线程,
  每个线程堆栈的默认大小为2 MB。主线程有
  堆栈增长的空间更大


因此,这就是为什么正常调用时它可以工作,而从辅助线程调用时却失败的原因之一。

10-08 20:01