gpt4 book ai didi

上下文切换 - ucontext_t 和 makecontext()

转载 作者:太空狗 更新时间:2023-10-29 15:22:05 25 4
gpt4 key购买 nike

我正在研究 C 编程中的上下文切换,并在 Internet 上找到了以下示例代码。我试图弄清楚是否只有 makecontext() 函数可以触发执行某些操作的函数。 setcontext()getcontext()swapcontext() 等其他函数用于设置上下文。

makecontext() 将函数及其参数附加到上下文,该函数是否始终坚持上下文,直到对它提交更改?

  1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <ucontext.h>
4 #define MEM 64000
5
6 ucontext_t T1, T2, Main;
7 ucontext_t a;
8
9 int fn1()
10 {
11 printf("this is from 1\n");
12 setcontext(&Main);
13 }
14
15 void fn2()
16 {
17 printf("this is from 2\n");
18 setcontext(&a);
19 printf("finished 1\n");
20 }
21
22 void start()
23 {
24 getcontext(&a);
25 a.uc_link=0;
26 a.uc_stack.ss_sp=malloc(MEM);
27 a.uc_stack.ss_size=MEM;
28 a.uc_stack.ss_flags=0;
29 makecontext(&a, (void*)&fn1, 0);
30 }
31
32 int main(int argc, char *argv[])
33 {
34 start();
35 getcontext(&Main);
36 getcontext(&T1);
37 T1.uc_link=0;
38 T1.uc_stack.ss_sp=malloc(MEM);
39 T1.uc_stack.ss_size=MEM;
40 makecontext(&T1, (void*)&fn1, 0);
41 swapcontext(&Main, &T1);
42 getcontext(&T2);
43 T2.uc_link=0;
44 T2.uc_stack.ss_sp=malloc(MEM);
45 T2.uc_stack.ss_size=MEM;
46 T2.uc_stack.ss_flags=0;
47 makecontext(&T2, (void*)&fn2, 0);
48 swapcontext(&Main, &T2);
49 printf("completed\n");
50 exit(0);
51 }

最佳答案

makecontext 将函数信息写入上下文,它将保留在那里直到被其他内容覆盖。 getcontext 会覆盖整个上下文,因此会覆盖之前调用 makecontext 时写入的任何函数。同样,swapcontext 完全覆盖其第一个参数指向的上下文。

基本思想是 u_context 包含某个时间部分进程上下文的快照。它包含所有机器寄存器、堆栈信息和信号掩码。它不包括任何内存映射或文件描述符状态。 u_context 中的状态正是您为了实现线程或协程而需要操作的所有状态。

编辑

swapcontext(&current, &another) 将当前上下文保存在current 中并切换到another。稍后,代码(从另一个上下文运行)可能会切换回当前(再次调用swapcontext)或者它可能会切换到某些第三个上下文。当上下文结束时(使用 makecontext 返回的函数设置),如果它的 uc_link 字段指向某个上下文,它将切换到该上下文。但是,如果 uc_link 为 NULL,则线程(如果只有一个线程,则为进程)将退出——其他未运行的上下文将被放弃。

关于上下文切换 - ucontext_t 和 makecontext(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21468529/

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