makecontext段错误?

时间:2010-12-28 17:55:04

标签: c multithreading

我正在完成将在下学期完成的家庭作业。它要求我们使用ucontext API实现我们自己的上下文切换/线程库。教授提供了执行此操作的代码,但在线程返回之前,他手动完成一些工作并调用ISR找到另一个要使用的线程并将swapcontexts用于它,或者如果没有剩下,则退出。

赋值的目的是使用上下文的uc_link字段,这样当它返回返回时它会处理工作。我创建了一个函数(类型为void / void args),它只执行函数之前的工作(清理然后调用ISR)。教授说他想要这个。

所以剩下的就是在uc_link字段的上下文中的某个地方做一个makecontext,以便它运行我的线程,对吧?好吧,当我看似ucontext_t和函数的任何组合makecontext时,我得到一个段错误并且gdb没有提供任何帮助..我可以跳过makecontext并且我的程序'正常'当它在我创建的线程中返回时返回因为(大概)uc_link字段没有正确设置(这正是我想要做的)。

我也找不到任何关于为什么makecontext会出现段错误的问题。有人可以帮忙吗?

stack2.ss_sp = (void *)(malloc(STACKSIZE));
if(stack2.ss_sp == NULL){
printf("thread failed to get stack space\n");
exit(8);
}
stack2.ss_size = STACKSIZE;
stack2.ss_flags = 0;

if(getcontext(&main_context) == -1){
perror("getcontext in t_init, rtn_env");
exit(5);
}

//main_context.uc_stack = t_state[i].mystk;                                                                                                                
main_context.uc_stack = stack2;
main_context.uc_link = 0;
makecontext(&main_context, (void (*)(void))thread_rtn, 0);

我也尝试过thread_rtn,& thread_rtn等等。 thread_rtn声明为void thread_rtn(void)。

以后,在每个帖子中。 run_env的类型为ucontext_t:     ...

t_state[i].run_env.uc_link = &main_context;

2 个答案:

答案 0 :(得分:0)

这里有很多事情,但我会给出最好的想法。我也试图在不解决作业的情况下回答这个问题。

在{(1}}声明的上下文中,是否使用任何非静态变量? 段错误可能是由已分配但不再可用的内存(脱离上下文或已释放)引起的。

我无法判断thread_rtn是否与线程上下文相同,两者应该是不同的。

看起来每个线程都需要自己的堆栈,它不应该与主上下文的堆栈相同(或者sam与任何其他线程的堆栈相同)。考虑每个线程可以将内存用作堆栈的位置。 main_context会在什么条件下返回malloc(STACKSIZE)

当线程上下文添加到主上下文时,NULL应该递增。看起来main_context.uc_link跟踪了与主要上下文链接的线程数。想想当计数减少时会发生什么(我试图留下一些与课程相关的工作,而不是说如何减少计数)。请注意特殊值0,表示不再有任何与此主上下文关联的线程。 main_context.uc_link是否有最大值?

希望这有帮助。

答案 1 :(得分:0)

我遇到了完全相同的问题,经过大量调试后,我找到了解决方案。

makecontext() 要求您传递堆栈底部,它会根据传递给它的大小自动计算堆栈顶部。

就我而言,

因为在 linux 中,堆栈是从上到下增长的,所以我按照克隆系统调用的要求传递了堆栈的顶部。所以,它给出了分段错误。

尝试一下,也许它会奏效。