使用boost coroutine2的意外输出

时间:2017-09-17 14:50:42

标签: c++ c++11 boost c++14 boost-coroutine

这是测试用例

#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);
}

由于某种原因,最后的断言失败,sum的值为14我使用命令安装了boost(版本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下载的boost文件夹。

上述测试用例的输出奇怪地没有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 个答案:

答案 0 :(得分:0)

使用boost-1.65.1输出你的应用程序:

Transferring 1
Currently 1
Transferring 2
Currently 2

可能你的问题是由在boost-1.63

中修复的bug引起的