makecontext()/ swapcontext()函数是否与C ++兼容

时间:2012-02-13 22:12:08

标签: c++ posix coroutine

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

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

1 个答案:

答案 0 :(得分:6)

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

正如你所说,线程不是一个有用的替代品,所以我继续使用swapcontext()。您可能还会发现this blog post对您自己的函数版本感兴趣。