本文的前置知识:你至少要知道其他语言的无栈协程是如何实现的,如C#,python。lua不算,lua实际上是有栈协程(对lua虚拟机有栈)
如果你看到这行文字,说明这篇文章被无耻的盗用了(或者你正在选中文字),请前往 cnblogs.com/pointer-smq 支持原作者,谢谢
编译时:
协程返回值::promise_type运行时:
coro = new state_object get_return_object() 但不着急返回(后文称此对象为future)await promise.initial_suspend() ,协程库编写者可以指定协程是否在刚启动时就立即暂停promise.return_value 或者 promise.return_void ,令另一边的future拿到协程的返回值await obj 会暂停协程,并将协程句柄交给obj,等obj通过此句柄再唤醒自己(后面细说)await promise.final_suspend() ,协程库编写者可以指定协程在执行完用户逻辑后暂停,来避免一些资源共享的问题单独说一下协程 r = await future 的流程
future.await_ready() ,若true,则表明future已经完成,协程不需要暂停(语义上是暂停立即恢复),跳到(3)future.await_suspend(handle) 将协程句柄交给futurefuture.await_suspend 的返回值可以是协程,那么调用会恢复这个协程(切过去),这就是前面提到的再await时才启动的协程的启动位置future.await_suspend 返回值也可以是bool,当bool是false的时候不暂停协程,直接跳到(3)r = future.await_resume() ,取出来future中的返回值一些重点:
Future<T>::promise_type 指定本future类型对应的promisepromise.initial_suspend / final_suspendpromise.get_return_object() 返回自己对应的future给调用者promise.return_value / return_void 看情况提供future.await_ready / await_suspendawait_suspend 传进来的 handle.resume()一些细节:
promise.initial_suspend 和 final_suspend 通常返回的是C++自带的awaitable:suspend_always 和 suspend_neverpromise.unhandled_exception() ,然后直接进入 final_suspendpromise.yield_valuefinal_suspend 后自动销毁,也可以由 coroutine_handle.destroy() 手动销毁coroutine_handle 就是new出来的state_object指针包一下,没有引用计数,也没有禁用拷贝,析构也不会自动delete,注意别泄露和悬挂coroutine_handle,所以给定一个promise引用,他可以通过取地址增减偏移量的方式,和 coroutine_handle 互相转换,通过 coroutine_handle::from_promise / coroutine_handle:promise 原文:https://www.cnblogs.com/pointer-smq/p/12863478.html