Segfault仅在pthread初始化时发生

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

使用pthreads来运行一个函数,我碰到一个SEGFAULT,将一个整数初始化为零。

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

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

我已经确认我没有堆栈空间。 但是我不能想到是什么导致函数在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。 主线程有更大的堆栈增长空间

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

    链接地址: http://www.djcxy.com/p/80273.html

    上一篇: Segfault occurs on initialization in pthread only

    下一篇: What data structures use 128MB of 1GB Linux kernel space?