在 Clang 中玩了一点 Coroutine TS 的当前实现后,我偶然发现了 asio 无堆栈协程实现。它们被描述为One* Header 中的 Portable Stackless Coroutines。主要处理异步代码我也想尝试它们。
函数内的协程块main
应等待函数中产生的线程异步设置的结果foo
。但是,一旦线程设置了值,我不确定如何让执行在该点<1>
(yield
表达式之后)继续。
使用 Coroutine 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;
}
谢谢你的帮助