4

我想使用纤维为我的游戏引擎实现一个作业系统。在网上搜索了一个很好的纤维 c++ 实现后,我发现Boost.Context是一个很好的起点。

更新 1:我想实现自己的调度算法,因此Boost.FiberBoost.CoroutineBoost.Coroutine2不适合我的实现。

在为 x64 架构编译 boost 并尝试运行 boost文档中的基本示例后,我得到了以下异常:

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 上下文的教程。你能指导我一些关于提升上下文的好资源/教程吗?

4

3 回答 3

0

如果您在 Windows 上运行并且该错误仅在发布模式下发生,您可能需要检查您的编译器标志是否设置正确。

这里

使用 fcontext_t 的 Windows:关闭全局程序优化 (/GL) 并将 /EHsc(编译器假定声明为 extern "C" 的函数从不抛出 C++ 异常)更改为 /EHs(告诉编译器假定声明为 extern "C" 的函数可能抛出异常)。

于 2019-05-12T02:23:24.947 回答
0

首先,记录了强制展开异常(并且是提供上下文 RAII 支持的原因)。

其次,如果您希望使用基于 Boost Context 构建的 Fiber,请使用现有的库:

更新:

在 Microsoft (R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x64 上使用 Boost 1.64.0 进行测试我无法重现该行为:

在此处输入图像描述

于 2017-08-08T14:13:19.630 回答
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();
}
于 2018-06-07T15:00:59.640 回答