9

在 unix 环境中makecontext()/swapcontext(),函数族有时用于在 C 中实现协程。然而,这些函数直接操作堆栈和执行流程。通常,当从 C 切换到 C++ 时,这些低级功能完全不同。

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

4

1 回答 1

7

我以前在 C++ 代码中使用过makecontext()/ swapcontext(),正如您所说,要注意的主要是异常。除此之外,我没有遇到任何麻烦。尽管根据标准它们已经过时,但它们仍然受到类 unix 操作系统的良好支持。(对于 Mac OS X 有一个警告:您必须#define _XOPEN_SOURCE#including相关标题之前。)使它们过时的理由也很蹩脚 - 他们可以用类似 pthreads 的版本替换它们,其中函数指针采用单个无效* 参数。

正如您所说,线程不是有用的替代品,所以我会继续使用swapcontext(). 您可能还会发现这篇博客文章对滚动您自己的函数版本很有趣。

于 2012-02-25T21:27:09.863 回答