【发布时间】:2019-01-14 03:49:30
【问题描述】:
在 Clang 中玩了一点 Coroutine TS 的当前实现后,我偶然发现了 asio 无堆栈协程实现。他们被描述为Portable Stackless Coroutines in One* Header。 主要处理异步代码,我也想尝试一下。
main 函数内的协程块应等待函数foo 中生成的线程异步设置的结果。但是,一旦线程设置了值,我不确定如何让执行在<1>(yield 表达式之后)处继续执行。
使用协程 TS 我会调用 coroutine_handle,但 boost::asio::coroutine 似乎不可调用。
这甚至可以使用boost::asio::coroutine吗?
#include <thread>
#include <chrono>
#include <boost/asio/coroutine.hpp>
#include <boost/asio/yield.hpp>
#include <cstdio>
using namespace std::chrono_literals;
using coroutine = boost::asio::coroutine;
void foo(coroutine & coro, int & result) {
std::thread([&](){
std::this_thread::sleep_for(1s);
result = 3;
// how to resume at <1>?
}).detach();
}
int main(int, const char**) {
coroutine coro;
int result;
reenter(coro) {
// Wait for result
yield foo(coro, result);
// <1>
std::printf("%d\n", result);
}
std::thread([](){
std::this_thread::sleep_for(2s);
}).join();
return 0;
}
感谢您的帮助
【问题讨论】:
-
我不认为 asio 协程旨在跨线程移动控制流。