gpt4 book ai didi

c - makecontext段错误?

转载 作者:太空宇宙 更新时间:2023-11-04 00:09:56 25 4
gpt4 key购买 nike

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

赋值的重点是使用上下文的 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_envucontext_t 类型):...

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

最佳答案

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

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

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

看起来每个线程都需要自己的堆栈,它不应该与主上下文的堆栈相同(或与任何其他线程的堆栈相同)。考虑每个线程可以在哪里获取内存以用作堆栈。在什么情况下 malloc(STACKSIZE) 会返回 NULL

当线程上下文添加到主上下文时,main_context.uc_link 应该递增。看起来 main_context.uc_link 正在跟踪有多少线程链接到主上下文。想想当计数减少时会发生什么(我试图留下一些与类(class)相关的思考而不是说如何处理减少的计数)。请注意 0 的特殊值,这意味着不再有任何线程与此主上下文相关联。 main_context.uc_link 是否有最大值?

希望这对您有所帮助。

关于c - makecontext段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4548132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com