在unix环境中,makecontext()/swapcontext()
系列函数有时用于在C中实现协同程序。但是这些函数直接操作堆栈和执行流程。通常当从C切换到C ++时,这些低级功能完全不同。
所以问题是,如果使用makecontext()
和swapcontext()
实现协同程序会有任何问题。当然,显然必须非常小心,异常永远不会逃脱这样的协同程序,因为堆栈上没有异常处理程序,程序很可能是段错误。但除此之外,C ++在内部处理事物的方式和makecontext()
以及setcontext()
修改执行路径之间是否存在任何不兼容性?
答案 0 :(得分:6)
之前我曾使用makecontext()
/ swapcontext()
和C ++代码,正如您所说,需要注意的主要事项是异常。除此之外,我没有遇到任何麻烦。尽管根据标准它们已经过时,但它们仍然受到类Unix操作系统的良好支持。 (Mac OS X有一个警告:在#define _XOPEN_SOURCE
相关标题之前你必须#including
。)使它们过时的理由也非常蹩脚 - 它们可以用pthreads代替它们 - 与版本一样,函数指针采用单个void *参数。
正如你所说,线程不是一个有用的替代品,所以我继续使用swapcontext()
。您可能还会发现this blog post对您自己的函数版本感兴趣。