在unix环境中,makecontext()/swapcontext()
函数族有时用于在C中实现协程。然而,这些函数直接操纵堆栈和执行流。通常,当从C切换到C++时,这些低级别的功能非常不同。
所以问题是,使用makecontext()
和swapcontext()
实现协同程序是否会有任何问题。当然,显然必须非常小心,异常永远无法逃脱这样的协程,因为堆栈上没有异常处理程序,程序很可能会出现segfault。但除此之外,C++内部处理事情的方式与makecontext()
和setcontext()
修改执行路径之间是否存在不兼容?
我以前在C++代码中使用过makecontext()
/swapcontext()
,正如您所说,主要需要注意的是异常。除此之外,我没有遇到任何麻烦。尽管根据标准,它们已经过时,但它们仍然得到了类unix操作系统的良好支持。(Mac OS X有一个警告:在#including
之前必须先#define _XOPEN_SOURCE
相关的标头。)让它们过时的理由也很站不住脚——它们本可以用类似pthreads的版本来取代它们,其中函数指针采用一个void*参数。
正如您所说,线程不是一个有用的替代品,所以我将继续使用swapcontext()
。您可能也会发现这篇博客文章对滚动自己版本的函数很有意思。