💣 Awacorn 中最不稳定的一个组件,负责实现 C++ 11 下的无栈协程,思路来自 DSL。
async 的。有栈协程在创建栈空间时速度较慢,换用无栈协程虽然不能达到 C++ 20 的速度,但可以尽可能省下申请栈带来的成本。
✅ 此组件仅依赖 STL。意味着它不需要 boost::context 或者 ucontext 支持。即使在单片机上也可以使用!
此头文件中的一切内容都可能因为最新一次 commit 而发生改变或完全被删除。在此组件完全稳定下来之前,请不要使用。
💎 进入异步函数上下文。
#include "awacorn/async.hpp"
promise<int> async_operation() {
return awacorn::async<int>([](awacorn::context<int>& ctx) {
ctx << ctx.ret(0);
}); // dev: 需要有一个更好的调用方式,而不是 ctx.call
}
int main() {
auto pm = awacorn::async<int>([](awacorn::context<int>& ctx) {
ctx << ctx.ret(ctx.call(async_operation) + 1);
});
pm.then([](int i) {
std::cout << i << std::endl;
});
}async内的匿名函数接受一个awacorn::context<T>&作为上下文参数。async会自动将函数的返回值类型作为promise的结果类型。
async需要指定一个模板参数作为异步上下文的返回类型。这同时也会影响到参数的模板类型。- 例如
async的模板参数为T,则函数的第一个参数类型应为awacorn::context<T>&。 - 目前暂时不支持根据函数签名自动推导返回类型,非常抱歉。以 C++ 的能力是无法做到全自动推导的。
- 例如
异步上下文。该类需要一个模板参数作为异步上下文返回值的类型。
💡 awacorn::context 不可被移动、拷贝、或者构造,只能通过 async 函数取得。
此上下文对象重载了 operator<< 以实现向上下文中追加 DSL 协程语句。可用的协程语句一般位于 ctx 中。比如,以下的方式将等待一个 promise 完成并且取得返回值。
#include "awacorn/async.hpp"
int main() {
auto pm = awacorn::async([](awacorn::context& ctx) {
ctx << ctx.ret(ctx.await(ctx.value(awacorn::resolve(1))) + 1);
});
pm.then([](int i) {
std::cout << i << std::endl;
});
}ctx <<后面的对象只能为detail::expr。