c - 为什么用户级线程(纤程)的实现需要为每个纤程分配一个新的堆栈?

标签 c multithreading stack fiber

在 C 中,可以使用 setjmp()longjmp() 对 fibers 进行编码,以在用户级别实现上下文切换。
如中所述 evanjones.caPortable Multithreading(pdf)还要求每个纤程都有一个新分配的堆栈。
由于纤程存在于线程上下文中,当它被调用时会自动关联一个堆栈帧,那么为什么它需要这个新分配的堆栈呢? : 当一根光纤要切换到另一根光纤时,可以使用以下方法:

 cpu_context[N] :global array where the i-th entry is the cpu context(jmp_buffer) of the i-th fiber 

fiber_ith :
   [...]
   if ( setjmp(cpu_context[i]) == 0 ){
        longjmp(cpu_context[j])
   }
   [...]

新堆栈的必要性是因为如所写here , 不可能使用 longjmp() 返回到 fiber 执行,其堆栈帧从 fiber 调用 longjmp() 的那一刻起不再有效?

编辑:这些纤程必须是非抢占式的,并且可以自愿从一根纤程切换到另一根纤程

最佳答案

假设一个 fiber 有一个函数调用另一个函数,另一个函数调用另一个函数,然后导致该 fiber 切换到另一个 fiber。当我们恢复这个纤程时,我们需要确保所有局部变量都回到纤程切换时的状态,我们需要确保从这个函数返回到调用函数。 因此出现了以下规则:

  1. 当纤程运行时,它可以改变它的堆栈。
  2. 恢复光纤时,堆栈必须回到光纤切换时的位置。

根据这两条规则,每个纤程都必须有自己的堆栈。

关于c - 为什么用户级线程(纤程)的实现需要为每个纤程分配一个新的堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51547497/

相关文章:

python - 如何找到将项目移动到堆栈中某个位置的最小移动次数?

c - Linux 上的可执行文件如何知道从哪里获取数据文件?

c - 环回设备上的组播

c++ - 函数中有函数原型(prototype)的目的是什么?

java - ConcurrentLinkedDeque 与 LinkedBlockingDeque

javascript - uv_queue_work 不在 Node 插件中运行 callback_method (c++)

java - 如何在 Java 中实现动态数组堆栈?

c - 是否有解析 POSIX 时区并验证它的函数?

WebAssembly 中的多线程

python - Pyparsing 标识符被压入堆栈两次