在Unix环境中,makecontext()/swapcontext()系列函数有时用于在C语言中实现协程。但是,这些函数直接操纵堆栈和执行流。当从C切换到C++时,这些低级功能通常会大相径庭。

所以问题是,使用makecontext()swapcontext()实现协程是否会出现问题。当然,显然必须非常小心,一个异常永远也不能逃脱这样的协程,因为在堆栈上没有为此的异常处理程序,程序很可能会发生段错误。但是除此之外,C++在内部处理事物的方式与makecontext()setcontext()修改执行路径之间是否存在任何不兼容?

最佳答案

我以前在C++代码中使用了makecontext()/swapcontext(),正如您所说,要注意的主要事情是异常。除此之外,我还没有遇到任何麻烦。尽管它们按照标准已过时,但仍得到类Unix操作系统的良好支持。 (Mac OS X有一个警告:必须在相关标题的#define _XOPEN_SOURCE之前添加#including。)使它们过时的理由也很la脚-他们可能已经用类似pthreads的版本替换了它们,其中函数指针需要一个void *参数。

如您所说,线程不是有用的替代方法,因此我将继续使用swapcontext()。您可能还会发现this blog post对于滚动您自己的函数版本很有趣。

10-04 14:46