我不明白为什么下面的伪代码会导致段错误。
使用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。主线程有
堆栈增长的空间更大
因此,这就是为什么正常调用时它可以工作,而从辅助线程调用时却失败的原因之一。