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