我想使用光纤为我的游戏引擎实现一个作业系统。在网上搜索了一个很好的c ++纤维实现后,我发现Boost.Context是一个很好的起点。
更新1 :我想实现自己的调度算法,因此Boost.Fiber,Boost.Coroutine,Boost.Coroutine2不适合我的实施。
在编译x64架构的升级并尝试从boost documentation运行基本示例后,我得到以下异常:
在内存位置boost :: context :: detail :: forced_unwind
这是我试图运行的代码(Visual Studio 2015企业版,Windows 7):
#include <iostream>
#include <boost\context\continuation.hpp>
namespace ctx=boost::context;
int main()
{
ctx::continuation source=ctx::callcc
(
[](ctx::continuation && sink)
{
int a=0;
int b=1;
for(;;)
{
sink=sink.resume(a);
auto next=a+b;
a=b;
b=next;
}
return std::move(sink);
}
);
for (int j=0;j<10;++j) {
std::cout << source.get_data<int>() << " ";
source=source.resume();
}
return 0;
}
代码正确运行(正确输出:0 1 1 2 3 5 8 13 21 34 55),但是当它完成运行后,我得到了异常。
更新2:仅针对发布版本
发生例外
我想问两个关于助推上下文的问题:
1)是什么导致堆栈展开异常,以及如何避免它?
2)我发现boost文档有点浅薄,找不到有关如何使用boost上下文的任何其他教程。你能指导我吗? 关于boost上下文的一些好的资源/教程?
答案 0 :(得分:0)
首先,强制展开异常is documented(以及RAII支持的上下文)。
其次,如果您希望基于Boost Context构建Fiber,请使用存在的库:
使用Boost 1.64.0在Microsoft(R)C / C ++上优化编译器版本19.00.24215.1 for x64进行测试我不能够重现行为:
答案 1 :(得分:0)
返回0后,源对象不在被破坏的位置。
类似的东西:
namespace ctx = boost::context;
int a;
bool stop = false;
{
ctx::continuation source = ctx::callcc(
[&stop, &a](ctx::continuation && sink) {
a = 0;
int b = 1;
for (;;) {
sink = sink.resume();
if (stop)
break;
int next = a + b;
a = b;
b = next;
}
return std::move(sink);
});
for (int j = 0; j < 10; ++j) {
std::cout << a << " ";
source = source.resume();
}
stop = true;
source.resume();
}
答案 2 :(得分:0)
如果您在Windows上运行并且该错误仅在发布模式下发生,则可能需要检查编译器标志是否设置正确。
来自here:
使用fcontext_t的Windows:关闭全局程序优化(/ GL)并将/ EHsc(编译器假定声明为extern“ C”的函数从不抛出C ++异常)更改为/ EHs(tell编译器假定声明为extern“的函数” C”可能会引发异常。