C 你犯了什么错?
我正在做下学期要交的家庭作业。它要求我们使用UContextAPI实现自己的上下文切换/线程库。教授提供了执行此操作的代码,但在线程返回之前,他手动执行一些工作,并调用ISR,找到另一个要使用的线程并将上下文交换给它,或者如果没有留下上下文,则退出 作业的要点是使用上下文的uc_链接字段,以便在返回时处理工作。我创建了一个函数(键入void/void args),它只执行函数之前所做的工作(清理并调用ISR)。教授说他想要这个 剩下的就是在uc_链接字段中的上下文中的某个地方创建一个makecontext,这样它就可以运行我的线程了,对吗?好吧,当我在ucontext和函数的任何组合上生成上下文时,我得到一个segfault,而gdb没有提供任何帮助。我可以跳过makecontext,当它在我创建的线程中点击返回时,我的程序“正常”退出,因为(可能)uc_链接字段没有正确设置(这就是我正在尝试的) 我也找不到关于makecontext为什么会出错的任何信息。有人能帮忙吗C 你犯了什么错?,c,multithreading,C,Multithreading,我正在做下学期要交的家庭作业。它要求我们使用UContextAPI实现自己的上下文切换/线程库。教授提供了执行此操作的代码,但在线程返回之前,他手动执行一些工作,并调用ISR,找到另一个要使用的线程并将上下文交换给它,或者如果没有留下上下文,则退出 作业的要点是使用上下文的uc_链接字段,以便在返回时处理工作。我创建了一个函数(键入void/void args),它只执行函数之前所做的工作(清理并调用ISR)。教授说他想要这个 剩下的就是在uc_链接字段中的上下文中的某个地方创建一个makeco
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);
我也试过线程、线程和其他东西。线程\u rtn被声明为void thread\u rtn(void)
稍后,在每个线程中(run\u env的类型为ucontext\u t):
这里发生了很多事情,但我会给出我最好的想法。我还试图回答问题而不解决家庭作业
thread\u rtn
是在什么上下文中声明的,它是否使用任何非静态变量?SEGFULT可能是由已分配但不再可用的内存(上下文无关或已释放)引起的 我不知道
main\u上下文是否与线程上下文相同,两者应该不同
看起来每个线程都需要自己的堆栈,它不应该与主上下文的堆栈(或sam与任何其他线程的堆栈)相同。考虑每个线程可以从哪里获得内存作为堆栈使用。在什么条件下malloc(STACKSIZE)
返回NULL
将线程上下文添加到主上下文时,main\u context.uc\u link
应递增。它看起来像是main\u context。uc\u link
正在跟踪有多少线程链接到主上下文。想想当计数减少时会发生什么(我试图留下一些与课程相关的思考工作,而不是说如何处理计数减少)。请注意特殊值0,这意味着不再有任何线程与此主上下文关联。main\u context.uc\u link
是否有最大值
希望这有帮助。我遇到了完全相同的问题,经过大量调试,我找到了解决方案
makecontext()要求您传递堆栈的底部,它会根据传递给它的大小自动计算堆栈的顶部
就我而言
因为在linux中,堆栈是从上到下增长的,所以我按照克隆系统调用的要求传递堆栈的顶部。所以,这是一个错误
试试看,也许它能用。请在这里或像pastebin这样的网站上发布一些代码。我十年前就发布了这篇文章,lolC及其bug即使几十年后也不会变老。也许这有助于某人:)
t_state[i].run_env.uc_link = &main_context;