Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 你犯了什么错?_C_Multithreading - Fatal编程技术网

C 你犯了什么错?

C 你犯了什么错?,c,multithreading,C,Multithreading,我正在做下学期要交的家庭作业。它要求我们使用UContextAPI实现自己的上下文切换/线程库。教授提供了执行此操作的代码,但在线程返回之前,他手动执行一些工作,并调用ISR,找到另一个要使用的线程并将上下文交换给它,或者如果没有留下上下文,则退出 作业的要点是使用上下文的uc_链接字段,以便在返回时处理工作。我创建了一个函数(键入void/void args),它只执行函数之前所做的工作(清理并调用ISR)。教授说他想要这个 剩下的就是在uc_链接字段中的上下文中的某个地方创建一个makeco

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

作业的要点是使用上下文的uc_链接字段,以便在返回时处理工作。我创建了一个函数(键入void/void args),它只执行函数之前所做的工作(清理并调用ISR)。教授说他想要这个

剩下的就是在uc_链接字段中的上下文中的某个地方创建一个makecontext,这样它就可以运行我的线程了,对吗?好吧,当我在ucontext和函数的任何组合上生成上下文时,我得到一个segfault,而gdb没有提供任何帮助。我可以跳过makecontext,当它在我创建的线程中点击返回时,我的程序“正常”退出,因为(可能)uc_链接字段没有正确设置(这就是我正在尝试的)

我也找不到关于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);
我也试过线程、线程和其他东西。线程\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;