2011-09-12 49 views
3

我正在嘗試與C進行協同程序和延續。我意識到我需要某種意大利麪條堆棧。是否有可能在新的調用堆棧中執行一個函數?當然在單線程內。我該如何創建一個新的獨立的調用堆棧並在其上執行一些代碼?如何用C做意大利式麪條?

回答

0

我仍然不確定延續,但至少對於協程來說,在C內部沒有好的方法。因爲這不是C抽象。 setjmp/longjmp有限制範圍可能會破壞C++/Objective-C異常系統,makecontext/swapcontext已被棄用。雖然有些系統仍然支持這些功能,但至少Apple OS不再支持它。

我唯一可以接受的解決方案是libtask library。它使用體系結構特定的彙編代碼來保存和恢復寄存器狀態,並且還管理調用堆棧。我認爲它使用單片堆棧,但仍然有大小限制,但無論如何,它幾乎是唯一可以找到可靠工作的解決方案。

我認爲Clang's Segmented Stack(或GCC的拆分堆棧)功能將在C級別啓用非常通用的協程支持。我希望以後可以隨時在LLVM上編寫協程代碼。

5

check out makecontext/swapcontext。

如果這些都不可用,那麼你可以使用setjmp/longjmp,但這些更復雜一點。

2

如果您在Windows上,您可以查看Fibers API。但是,Evil Otto的答案更符合便攜/ POSIX標準。

相關問題