实现ArcWake trait为何能避免编写异步Future相关的重复样板代码?
原理说明
你不需要手动编写的所有逻辑,都已经由futures库在ArcWake的配套封装中提前实现好了。
标准库的Waker底层基于RawWaker实现,如果你要手动构造一个符合规范的Waker,必须完成以下几部分工作:
- 手动定义符合
RawWakerVTable接口要求的函数指针集合,包含clone、wake、wake_by_ref、drop四个函数,每个函数都要自行处理Arc的引用计数增减逻辑 - 所有操作裸指针、操作
RawWaker的代码都需要标记为unsafe,且你要自行保证所有指针操作、引用计数管理的内存安全 - 上述逻辑几乎是所有Waker实现的通用代码,每次手写都是重复的样板代码,没有任何业务价值
ArcWake的设计就是把通用逻辑和业务逻辑做了拆分:
- 开发者只需要实现
wake这一个业务方法,定义Waker被触发时需要执行的自定义调度逻辑即可 - 剩余的vtable创建、
Arc与裸指针的转换、引用计数管理、unsafe代码全部由futures库内部统一实现,库侧已经保证了这部分通用逻辑的内存安全,不需要开发者重复编写
你实现ArcWake之后,只需要调用库提供的转换方法就能直接拿到可用的Waker实例,底层的vtable是库预先为所有ArcWake实现统一提供的,自然不需要你再手动创建vtable和编写相关的样板、unsafe代码。
内容的提问来源于stack exchange,提问作者jgpaiva
相关产品推荐
相关产品推荐

