如何正确使用提升上下文

时间:2017-08-08 13:15:58

标签: c++ boost fibers

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

  

更新1 :我想实现自己的调度算法,因此Boost.FiberBoost.CoroutineBoost.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上下文的一些好的资源/教程?

3 个答案:

答案 0 :(得分:0)

首先,强制展开异常is documented(以及RAII支持的上下文)。

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

更新

使用Boost 1.64.0在Microsoft(R)C / C ++上优化编译器版本19.00.24215.1 for x64进行测试我能够重现行为:

enter image description here

答案 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”可能会引发异常。