Неожиданный вывод с буст-сопрограммой2

Это тестовый пример

#include <boost/coroutine2/all.hpp>

#include <iostream>
#include <cassert>

int main() {
    auto sum = 0;
    using Coroutine_t = boost::coroutines2::coroutine<int>::push_type;
    auto coro = Coroutine_t{[&](auto& yield) {
        for (;;) {
            auto val = yield.get();
            std::cout << "Currently " << val << std::endl;
            sum += val;
            yield(); // jump back to starting context
         }
    }};

    std::cout << "Transferring 1" << std::endl;
    coro(1); // transfer {1} to coroutine-function
    std::cout << "Transferring 2" << std::endl;
    coro(2); // transfer {1} to coroutine-function

    // assert(sum == 3);
}

По некоторым причинам утверждение в конце терпит неудачу со значением суммы, являющейся 14 Я установил буст (версия 1.63) с помощью команды

./bootstrap.sh --prefix=build --with-libraries=context
./b2 --prefix=build --with-context

Я запускаю это на MacOS 10.12.6, Команда компиляции была

g++ -std=c++14 -O3 -I boost co.cpp boost/stage/lib/libboost_*.a

куда boost это папка для загрузки, скачанная с sourceforge.

Вывод вышеприведенного теста странным образом без assert это

Transferring 1
Currently 0
Transferring 2
Currently 2
Currently 2

Почему первая строка напечатана в сопрограмме Currently 0? И почему Currently 2 печатается дважды здесь?? Последнее также можно увидеть здесь https://wandbox.org/permlink/zEL9fGT5MrzWGgQB


Что касается второго вопроса, то похоже, что после завершения основного потока управление передается обратно сопрограмме в последний раз. Это почему? Это кажется странным..

ОБНОВЛЕНИЕ: Для второго вопроса, это похоже на повышение в 1.65??!? https://wandbox.org/permlink/JQa9Wq1jp8kB49Up

1 ответ

Вывод вашего приложения с boost-1.65.1:

Transferring 1
Currently 1
Transferring 2
Currently 2

возможно ваша проблема была вызвана ошибкой, которая была исправлена ​​в boost-1.63

Другие вопросы по тегам