我正在学习如何使用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();
}
有人可以帮助我理解这种行为吗?
答案 0 :(得分:0)
原因在于Boost中的一个错误。我在Boost 1.65.1中检查过一切正常。以下是证明:https://wandbox.org/permlink/pRuSgnwa3VPdqNUk