在C中,可以使用setjmp()
和longjmp()
对光纤进行编码,以在用户级别实现上下文切换。
如中所述
evanjones.ca和Portable 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()
开始堆栈帧就不再有效的光纤执行?编辑:这些光纤必须是非抢占式的,并且可以从一根光纤自愿切换到另一根光纤
最佳答案
假设一个光纤有一个调用另一个函数的函数,该函数调用另一个函数,然后导致该光纤被切换到另一个光纤。当我们恢复这个纤程时,我们需要确保所有的局部变量都恢复到纤程切换时的状态,并且我们需要确保从这个函数返回到调用函数。
因此,出现了以下规则:
当光纤运行时,它可以改变其堆栈。
当光纤恢复时,堆栈必须回到光纤切换时的位置。
根据这两条规则,每根光纤都必须有自己的堆栈。