在C中,可以使用setjmp()longjmp()对光纤进行编码,以在用户级别实现上下文切换。
如中所述
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])
   }
   [...]

新堆栈的必要性是由于这样一个事实,即在写入时,不可能使用longjmp()返回到从光纤调用longjmp()开始堆栈帧就不再有效的光纤执行?
编辑:这些光纤必须是非抢占式的,并且可以从一根光纤自愿切换到另一根光纤

最佳答案

假设一个光纤有一个调用另一个函数的函数,该函数调用另一个函数,然后导致该光纤被切换到另一个光纤。当我们恢复这个纤程时,我们需要确保所有的局部变量都恢复到纤程切换时的状态,并且我们需要确保从这个函数返回到调用函数。
因此,出现了以下规则:
当光纤运行时,它可以改变其堆栈。
当光纤恢复时,堆栈必须回到光纤切换时的位置。
根据这两条规则,每根光纤都必须有自己的堆栈。

10-02 04:20