Ошибка сопрограммы boost1.53?

Я использую сопрограмму Boost 1.53 и пробую код из http://www.boost.org/doc/libs/1_53_0/libs/coroutine/doc/html/coroutine/coroutine.html#coroutine.coroutine.calling_a_coroutine:

typedef boost::coroutines::coroutine< void() > coro_t;
void fn( coro_t::caller_type & ca, int j) {
for(int i = 0; i < j; ++i) {
std::cout << "fn(): local variable i == " << i << std::endl;
ca();
}
}

int main(int argc, char *argv[]) {
// bind parameter '7' to coroutine-fn
coro_t c( boost::bind( fn, _1, 7) );

std::cout << "main() starts coroutine c" << std::endl;

while ( c)
{
std::cout << "main() calls coroutine c" << std::endl;
// execution control is transferred to c
c();
}

std::cout << "Done" << std::endl;

return EXIT_SUCCESS;
}

выход:

fn(): local variable i == 0
main() starts coroutine c
main() calls coroutine c
fn(): local variable i == 1
main() calls coroutine c
fn(): local variable i == 2
main() calls coroutine c
fn(): local variable i == 3
main() calls coroutine c
fn(): local variable i == 4
main() calls coroutine c
fn(): local variable i == 5
main() calls coroutine c
fn(): local variable i == 6
main() calls coroutine c
Done

Вывод отличается от ссылки в первых двух.
Это ошибка?

1

Решение

Ваш ответ в первом предложении документации:

Контроль выполнения передается сопрограмме в строительство (функция сопрограммы введена)

Когда вы создаете сопрограмму, она вызывает ее практически сразу, поэтому первая строка печатается перед вашим сообщением main() starts coroutine c, Сопрограмма фактически начинается здесь:

    coro_t c( boost::bind( fn, _1, 7) );

Я бы сказал, что вывод их примера неверен по сравнению с самим примером. На самом деле, нет никакого кода между двумя std::cout звонит в main Кроме как while (c)так что я не вижу, как вывод мог возможно соответствовать примеру. Я не думаю, что тестирование предиката продолжения должно запустить сопрограмму. Учитывая пример после этого первого, я подозреваю, что они хотели написать:

    std::cout << "main() starts coroutine c" << std::endl;

// bind parameter '7' to coroutine-fn
coro_t c( boost::bind( fn, _1, 7) );

В следующем примере вы можете увидеть, что они вызывают конструктор после сообщение от main и получите результат, который вы ожидаете:

int main( int argc, char * argv[])
{
std::cout << "main(): call coroutine c" << std::endl;
coro_t c( fn, 7);

int x = c.get();
std::cout << "main(): transferred value: " << x << std::endl;

x = c( 10).get();
std::cout << "main(): transferred value: " << x << std::endl;

std::cout << "Done" << std::endl;

return EXIT_SUCCESS;
}

приводит к:

output:
main(): call coroutine c
fn(): local variable i == 7
main(): transferred value: 7
fn(): local variable i == 10
main(): transferred value: 10
Done
3

Другие решения

Других решений пока нет …