欢迎访问 内存溢出 —— 独立后端与系统工程技术博客

专注于分布式系统、Linux内核、数据库存储与后端工程实践

Rust 异步编程:Future trait 与 Pin 的内存安全语义

发表于:|最后更新:|分类:系统编程|阅读:1931 次

Rust 的异步模型建立在 Future trait 之上,其核心方法是 poll,返回 Poll::Ready 或 Poll::Pending。由于编译器生成的异步状态机可能包含自引用结构,Pin 被引入以保证被固定的值不会被移动。

一、Future trait 定义

rust
pub trait Future {
    type Output;
    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>;
}

Pin<&mut Self> 保证 Future 一旦开始轮询,其内存地址便不再变化,从而允许安全地持有指向自身字段的引用。

二、手写 Future 的注意事项

  • 不要在 poll 中执行阻塞操作
  • 未就绪时需注册 Waker,否则任务将永远不会被唤醒
  • 使用 tokio::pin! 或 Box::pin 处理需要固定到堆上的 Future