Я учусь пользоваться библиотекой 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.
Но, к моему удивлению, когда я удаляю вызов «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};
}
Результат по-прежнему:
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.
Как это возможно? Как это работает? Я ожидал, что когда я не вызову сопрограмму, тогда, даже если есть еще один «выход», ничего не произойдет.
И я нахожу также странным это поведение:
Когда я добавляю еще один «исходный» оператор в основной, код все равно печатается так же, как и в начале!
#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.
Никаких ошибок, даже если поиск происходит чаще, чем есть.
Только после добавления еще одного «источника» в основную функцию я получаю ошибку времени выполнения (это приложение запросило время выполнения, чтобы завершить его необычным способом …)
int main()
{
cr::pull_type source{creator};
source();
source();
source();
}
Может ли кто-нибудь помочь мне, пожалуйста, с пониманием этого поведения?
Причина кроется в ошибке в Boost. Я проверил, что в Boost 1.65.1 все отлично работает. Вот доказательство: https://wandbox.org/permlink/pRuSgnwa3VPdqNUk
Других решений пока нет …