C++ 如何正确使用boost上下文

C++ 如何正确使用boost上下文,c++,boost,fibers,C++,Boost,Fibers,我想使用光纤为我的游戏引擎实现一个作业系统。在网上搜索了一个不错的C++实现的光纤,我发现这是一个很好的起点。 更新1:我想实现我自己的调度算法,因此不适合我的实现 编译boost for x64体系结构并尝试从boost运行基本示例后,我遇到以下异常: boost::context::detail::在内存位置强制展开 这是我尝试运行的代码(Visual Studio 2015企业版,windows 7): #包括 #包括 名称空间ctx=boost::context; int main()

我想使用光纤为我的游戏引擎实现一个作业系统。在网上搜索了一个不错的C++实现的光纤,我发现这是一个很好的起点。 更新1:我想实现我自己的调度算法,因此不适合我的实现

编译boost for x64体系结构并尝试从boost运行基本示例后,我遇到以下异常:

boost::context::detail::在内存位置强制展开

这是我尝试运行的代码(Visual Studio 2015企业版,windows 7):

#包括
#包括
名称空间ctx=boost::context;
int main()
{
ctx::continuation source=ctx::callcc
(
[](ctx::继续和接收)
{
int a=0;
int b=1;
对于(;;)
{
下沉=下沉。恢复(a);
自动下一步=a+b;
a=b;
b=下一个;
}
返回标准::移动(水槽);
}
);

对于(intj=0;j首先,强制展开异常(这是上下文RAII支持的原因)

其次,如果您希望构建基于Boost上下文的光纤,请使用现有的库:

  • 也许也/
更新: 在Microsoft(R)C/C++优化编译器版本19.00.24215.1 for x64 I上使用Boost 1.64.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();
}
namespace ctx=boost::context;
INTA;
bool-stop=false;
{
ctx::continuation source=ctx::callcc(
[&stop,&a](ctx::continuation&&sink){
a=0;
int b=1;
对于(;;){
sink=sink.resume();
如果(停止)
打破
int next=a+b;
a=b;
b=下一个;
}
返回标准::移动(水槽);
});
对于(int j=0;j<10;++j){

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

发件人:

使用FraceTeXT的Windows:关闭全局程序优化(/GL)和更改/EHSC(编译器假定声明为Extrun的函数C“从不抛出C++异常”到/EHS(告诉编译器假定声明为Extn”C的函数可能引发异常”。


在您的案例中,返回时不要使用
std::move
,还有什么选择?boost文档中的所有示例(即使是不使用std::move的示例)都有相同的例外。我没有回答您的问题,因为我不知道答案。我只是提醒您不要使用
std::move
。在这种情况下,它不会有帮助,可能会减慢执行时间。您是否建议通过引用传递它(sink)?换句话说,使用return&sink而不是std::move(sink)?首先,我想实现我自己的调度算法,因此boost fiber\Corroutine不适合我的作业系统。其次,我知道它有文档记录,但我的问题是如何避免它。更新了我的问题。事实上,未经处理的解绕异常发生在到达
std::cout@dontcarebar之前:您可以使用另一个运行队列实现,以查看示例/work_sharing.cpp或include/boost/fiber/algo/work_steering.hpp(spmc队列)。@dontcarebar:您可以将std:.原子与boost一起使用(grep表示bosot.fiber的资源中的原子)。您能否澄清“源对象不在要销毁的位置”这句话有一点?我不明白这是什么意思。在sink=sink.resume()之后,堆栈可能包含活动对象,必须正确地销毁它们。
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();
}