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?