setjmp()
在 C 中可以使用和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()
?
编辑:这些光纤必须是非抢占式的,并且可以自愿从一根光纤切换到另一根光纤