【发布时间】:2017-08-08 13:15:58
【问题描述】:
我想使用纤维为我的游戏引擎实现一个作业系统。在网上搜索了一个好的 c++ 实现的 fiber 后,我发现 Boost.Context 是一个很好的起点。
更新1:我想实现自己的调度算法,因此Boost.Fiber、Boost.Coroutine、Boost.Coroutine2不适合我的实现。
在为 x64 架构编译 boost 并尝试从 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 文档有点肤浅,并且找不到任何其他关于如何使用提升上下文的教程。你能指导我吗 到一些关于提升上下文的好资源/教程?
【问题讨论】:
-
不要在你的情况下使用
std::move返回 -
有什么替代方案?对于 boost 文档中的所有示例(即使是那些不使用 std::move 的示例),我都遇到了相同的异常。
-
我没有回答你的问题,因为我不知道答案。我只是提醒你不要在这种情况下使用
std::move,它不会有帮助,而且可能只会减慢执行时间。 -
您是否建议通过引用传递它(接收器)?换句话说,返回 &sink 而不是 std::move(sink)?