-2

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

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

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

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

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

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

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
4

1 回答 1

4

我已确认我的堆栈空间不足。但我想不出是什么导致函数在 pthread 内部表现不同

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

TLPI说:

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

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

于 2013-04-11T23:07:21.770 回答