在 C 中,可以使用 setjmp()
和 longjmp()
对 fibers 进行编码,以在用户级别实现上下文切换。
如中所述
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])
}
[...]
新堆栈的必要性是因为如所写here , 不可能使用 longjmp()
返回到 fiber 执行,其堆栈帧从 fiber 调用 longjmp()
的那一刻起不再有效?
编辑:这些纤程必须是非抢占式的,并且可以自愿从一根纤程切换到另一根纤程
最佳答案
假设一个 fiber 有一个函数调用另一个函数,另一个函数调用另一个函数,然后导致该 fiber 切换到另一个 fiber。当我们恢复这个纤程时,我们需要确保所有局部变量都回到纤程切换时的状态,我们需要确保从这个函数返回到调用函数。 因此出现了以下规则:
- 当纤程运行时,它可以改变它的堆栈。
- 恢复光纤时,堆栈必须回到光纤切换时的位置。
根据这两条规则,每个纤程都必须有自己的堆栈。
关于c - 为什么用户级线程(纤程)的实现需要为每个纤程分配一个新的堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51547497/