我无法理解为什么以下伪代码会导致段错误。
使用pthreads运行一个函数我遇到一个SEGFAULT,将一个整数初始化为零。
当my_threaded_function
不在线程上下文中或者我从主线程调用函数时没有问题。
仅在rc=0;
函数内初始化maze_init
时才会出现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
)答案 0 :(得分:4)
我已经确认我没有堆栈空间。但我想不到 是什么导致函数在pthread内部表现不同
默认情况下,一个默认的辅助线程比“主”线程具有更小的堆栈。您可以使用pthread_attr_setstacksize
设置尺寸。
TLPI说:
每个线程都有自己的堆栈,其大小在线程固定时是固定的 创建。在Linux / x86-32上,对于主线程以外的所有线程, 每个线程堆栈的默认大小为2 MB。 主线程有 更大的堆栈增长空间
这就是为什么它在正常调用时会起作用并在从辅助线程调用时失败的一个原因。