如何用C制作意大利面堆?

时间:2011-09-12 18:34:31

标签: c callstack coroutine

我正在努力制作协程并继续使用C.我意识到我需要某种意大利面堆叠。是否可以在新的调用堆栈中执行函数?当然在单线程内。如何创建一个新的,分离的调用堆栈,并在其上执行一些代码?

3 个答案:

答案 0 :(得分:5)

查看makecontext / swapcontext。

如果那些不可用,那么你可以使用setjmp / longjmp,但那些更复杂。

答案 1 :(得分:2)

如果您使用的是Windows,则可以查看Fibers API。然而,Evil Otto的答案更符合便携性/ POSIX标准。

答案 2 :(得分:0)

我仍然不确定延续,但至少对于协程,没有好的方法在C中做到这一点。因为这是C抽象。 setjmp/longjmp具有范围限制可能会破坏C ++ / Objective-C异常系统,makecontext/swapcontext已被弃用。虽然有些系统仍然支持这些功能,但至少Apple OS不再支持它了。

唯一可以接受的解决方案是libtask library。它使用体系结构特定的汇编代码来保存和恢复寄存器状态,它还管理调用堆栈。我认为它使用单片堆栈并且仍然有大小限制,但无论如何,它几乎是我能找到的唯一可靠工作的解决方案。

我认为Clang's Segmented Stack(或GCC的Split Stack)功能将在C级上启用非常通用的协程支持。我希望以后可以自由地在LLVM上编写协程代码。