gpt4 book ai didi

c++ - boost 协程 2 的意外输出

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:42:45 26 4
gpt4 key购买 nike

这是测试用例

#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 我使用命令安装了 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


对于第二个问题,似乎是在主线程完成后,最后一次将控制权转移回协程。这是为什么?这看起来很奇怪..

更新:对于第二个问题,boost 1.65 似乎有所不同??!? https://wandbox.org/permlink/JQa9Wq1jp8kB49Up

最佳答案

使用 boost-1.65.1 的应用输出为:

Transferring 1
Currently 1
Transferring 2
Currently 2

可能你的问题是由 boost-1.63 中已修复的错误引起的

关于c++ - boost 协程 2 的意外输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46265373/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com