51·异步编程高级

Pin 与 Unpin

Pin 与 Unpin

学习目标

  1. 理解 Pin 的作用
  2. 理解自引用结构
  3. 掌握 Unpin trait

核心概念

为什么需要 Pin

// async 块编译后是自引用结构体
// 自引用结构体不能安全移动(指针会失效)
// Pin 保证值不会被移动

Pin<P>

use std::pin::Pin;

// Pin<P> 包裹一个指针 P
// 保证 P 指向的值不会被移动

let mut data = String::from("hello");
let pinned = Pin::new(&mut data);
// pinned 保证 data 不会被移动

Unpin trait

// 大部分类型自动实现 Unpin
// 实现 Unpin 的类型可以安全地从 Pin 中取出

// !Unpin 的类型:
// - async 块生成的 Future
// - 用 #[pin] 标记的类型

pin_project

[dependencies]
pin-project = "1"
use pin_project::pin_project;

#[pin_project]
struct MyFuture<F> {
    #[pin]
    inner: F,
    data: String,
}

Box::pin

use std::pin::Pin;

fn returns_future() -> Pin<Box<dyn Future<Output = i32>>> {
    Box::pin(async { 42 })
}

小结

概念说明
Pin<P>防止值被移动的包装
Unpin标记类型可以安全移动
Box::pin在堆上创建固定值
pin_project安全地投影固定结构体的字段

练习编辑器

rust
Loading...