- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在做下学期要交的家庭作业。它要求我们使用 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_env 是 ucontext_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/
作为我任务的一部分,我一直在实现一个用户线程库。我不明白 makecontext 函数: makecontext(&(mainthread->threadctx),(void(*)(void))sta
我的问题与这一行有关: int f = makecontext( &threadList[ numThreads ].context 我的程序在没有赋值操作的情况下编译没有错误,但根本无法运行
我的程序包含以下行: makecontext( &threadList[ numThreads ].context, (void (*)(void)) &threadStart, 1, 5); 其中
我需要实现一个库来使用 C 语言的线程。用户应该传递线程的函数及其参数,然后我需要为其处理和创建线程。这是添加新线程的函数: int add_thread(void (*func)(int),
这个问题在这里已经有了答案: 关闭 11 年前。 我想按如下方式将变量参数传递给 makecontext 函数。 void a(...) { .... makecontext( &stack,
我正在尝试制作一个像 pthreads 这样的用户级线程库。我正在使用 makecontext()/swapcontext() 在线程之间进行切换,并在为线程创建上下文时传递 uctx_main 到上
我正在研究 C 编程中的上下文切换,并在 Internet 上找到了以下示例代码。我试图弄清楚是否只有 makecontext() 函数可以触发执行某些操作的函数。 setcontext()、getc
makecontext 的手册页声明 argc 之后的参数应该仅为 integer(int): ...the function func is called, and passed the serie
我看到了一些关于用户线程库的问题,但似乎没有一个能回答我的问题。我能够创建线程、运行它们、取消它们以及退出它们。由于某种原因我不能做的是让线程返回数据。 当我初始化我的线程库时,我将我的退出线程上下文
在another question我在移植代码时遇到了问题: unsigned long stack[] = { 1, 23, 33, 43 }; /* save all the registers
来自 makecontext() 手册... Due to limitations in the current pthread implementation, makecontext should
我对上下文切换很感兴趣。我已将示例代码复制到文件中 http://pubs.opengroup.org/onlinepubs/009695399/functions/makecontext.html
在 unix 环境中,makecontext()/swapcontext() 函数系列有时用于在 C 中实现协程。然而,这些函数直接操作堆栈和执行流。当从 C 切换到 C++ 时,这些低级功能通常有很
在调用makecontext之前,为什么我们需要设置堆栈大小ss_size? 我刚刚有一个针对 makecontext/swapcontext 代码段的单元测试用例,它因 SIGSEGV 而失败。发生
我已成功使用 makecontext/swapcontext 移动堆栈。但是,当我尝试将它与 pthread_mutex_lock 或 pthread_mutex_unlock 一起使用时,我总是
我无法将 C++0x lambda 函数作为第二个参数传递给 makecontext(来自 ucontext.h)。 makecontext 的签名是: void makecontext(uconte
#include #include #define _XOPEN_SOURCE 600 #include /* Tests creation. Should print "Hello Wo
我是一名优秀的程序员,十分优秀!