Coroutines2 - 为什么在没有来源调用时产量会运行

时间:2017-04-26 20:56:00

标签: c++ boost-coroutine2

我正在学习如何使用boost coroutines2库。我已经阅读了一些教程并开始尝试它。但后来我发现了一些令人困惑的事情。请看一下这个基本的例子。

#include <boost/coroutine2/all.hpp>
#include <iostream>

using namespace std;
typedef boost::coroutines2::coroutine<int> cr;

void creator(cr::push_type& yield)
{
    cout << "First time." << endl;
    yield(1);
    cout << "Second time. " << endl;
    yield(2);
}

int main()
{
    cr::pull_type source{creator};
    source();
}

结果当然是这样的:

First time.
Second time. 

但令我惊讶的是,当我在main函数中删除'source'调用时,结果是一样的! (根据教程,coroutine在构造时第一次调用,所以可以调用它,但现在应该只调用一次!)

#include <boost/coroutine2/all.hpp>
#include <iostream>

using namespace std;
typedef boost::coroutines2::coroutine<int> cr;

void creator(cr::push_type& yield)
{
    cout << "First time." << endl;
    yield(1);
    cout << "Second time. " << endl;
    yield(2);
}

int main()
{
    cr::pull_type source{creator};
}

结果仍然是:

First time.
Second time. 

当我删除协程中的第二个'yield'时,结果也是一样的:

#include <boost/coroutine2/all.hpp>
#include <iostream>

using namespace std;
typedef boost::coroutines2::coroutine<int> cr;

void creator(cr::push_type& yield)
{
    cout << "First time." << endl;
    yield(1);
    cout << "Second time. " << endl;
}

int main()
{
    cr::pull_type source{creator};
}

结果:

First time.
Second time. 

怎么可能?它是如何工作的?我预计当我不打电话给coroutine时,即使有另一个'yield'等待,也不会发生任何事情。

我发现这种行为也很奇怪:

当我在main中添加另一个'source'语句时,代码仍然会像开头一样打印出来!

#include <boost/coroutine2/all.hpp>
#include <iostream>

using namespace std;
typedef boost::coroutines2::coroutine<int> cr;

void creator(cr::push_type& yield)
{
    cout << "First time." << endl;
    yield(1);
    cout << "Second time. " << endl;
    yield(2);
}

int main()
{
    cr::pull_type source{creator};
    source();
    source();
}

结果:

First time.
Second time. 

没有错误,即使采购的次数超过'收益率'。 只有在main函数中再添加一个'source'后才会收到运行时错误(此应用程序已请求Runtime以不寻常的方式终止它...)

int main()
{
    cr::pull_type source{creator};
    source();
    source();
    source();
}

有人可以帮助我理解这种行为吗?

1 个答案:

答案 0 :(得分:0)

原因在于Boost中的一个错误。我在Boost 1.65.1中检查过一切正常。以下是证明:https://wandbox.org/permlink/pRuSgnwa3VPdqNUk