💣 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
。