From ccc356f2852378b7ec1509894a87a3fb06675df7 Mon Sep 17 00:00:00 2001 From: sunface Date: Fri, 21 Jan 2022 12:06:23 +0800 Subject: [PATCH] add Pin/Unpin --- book/contents/async/pin-unpin.md | 256 ++++++++++++++++++++++++++++--- book/contents/img/async-03.png | Bin 0 -> 34163 bytes 2 files changed, 235 insertions(+), 21 deletions(-) create mode 100644 book/contents/img/async-03.png diff --git a/book/contents/async/pin-unpin.md b/book/contents/async/pin-unpin.md index e09dae52..8c7ecca9 100644 --- a/book/contents/async/pin-unpin.md +++ b/book/contents/async/pin-unpin.md @@ -1,11 +1,13 @@ # 定海神针Pin和Unpin -在Rust异步编程中,有一个定海神针般的存在,它就是`Pin`,作用说简单也简单,说复杂也非常复杂,当初刚出来时就连一些Rust大佬都一头雾水,何况瑟瑟发抖的我。好在今非昔比,目前网上的资料已经很全,因此我借花献佛,给大家好好讲讲这个`Pin`。 +在Rust异步编程中,有一个定海神针般的存在,它就是 `Pin` ,作用说简单也简单,说复杂也非常复杂,当初刚出来时就连一些 Rust 大佬都一头雾水,何况瑟瑟发抖的我。好在今非昔比,目前网上的资料已经很全,而我就借花献佛,给大家好好讲讲这个`Pin`。 在Rust中,所有的类型可以分为两类: - **类型的值可以在内存中安全地被移动**,例如数值、字符串、布尔值、结构体、枚举,总之你能想到的几乎所有类型都可以落入到此范畴内 -- **自引用类型**,大魔王来了,大家快跑,在之前章节我们已经见识过它的厉害,下面来看看自引用类型的一种简单解决方法: +- **自引用类型**,大魔王来了,大家快跑,在之前章节我们已经见识过它的厉害 + +下面就是一个自引用类型 ```rust struct SelfRef { value: String, @@ -13,16 +15,14 @@ struct SelfRef { } ``` -在上面的结构体中,`pointer_to_value`是一个原生指针,指向第一个字段`value`持有的字符串`String`。很简单对吧?现在考虑一个情况,若`String`被移动了怎么办? +在上面的结构体中,`pointer_to_value` 是一个原生指针,指向第一个字段 `value` 持有的字符串 `String` 。很简单对吧?现在考虑一个情况, 若`String` 被移动了怎么办? -此时一个致命的问题就出现了:新的字符串的内存地址变了,而`pointer_to_value`依然指向之前的地址,一个重大bug就出现了! +此时一个致命的问题就出现了:新的字符串的内存地址变了,而 `pointer_to_value` 依然指向之前的地址,一个重大bug就出现了! -原生指针是`unsafe`的,因此遇到这种问题也在情理之中,谁让我们不用Rust提供的安全引用类型呢。但是既然已经用了,抱怨也没用,那么有没有办法解决这个问题? - -答案就是使用`Pin`,它可以防止一个类型在内存中被移动。再来回忆下之前在`Futuer`章节中,我们提到过在`poll`方法的签名中有一个`self: Pin<&mut Self>`,那么为何要在这里使用`Pin`呢? +灾难发生,英雄在哪?只见 `Pin` 闪亮登场,它可以防止一个类型在内存中被移动。再来回忆下之前在 `Future` 章节中,我们提到过在 `poll` 方法的签名中有一个 `self: Pin<&mut Self>` ,那么为何要在这里使用 `Pin` 呢? ## 为何需要Pin -其实`Pin`还有一个小伙伴`UnPin`,与前者相反,后者表示类型可以在内存中安全地移动。在深入之前,我们先来回忆下`async/.await`是如何工作的: +其实 `Pin` 还有一个小伙伴 `UnPin` ,与前者相反,后者表示类型可以在内存中安全地移动。在深入之前,我们先来回忆下 `async/.await` 是如何工作的: ```rust let fut_one = /* ... */; // Future 1 let fut_two = /* ... */; // Future 2 @@ -32,16 +32,16 @@ async move { } ``` -在底层,`async`会创建一个实现了`Future`的匿名类型,并提供了一个`poll`方法: +在底层,`async` 会创建一个实现了 `Future` 的匿名类型,并提供了一个 `poll` 方法: ```rust -// `async { ... }`语句块创建的`Future`类型 +// `async { ... }`语句块创建的 `Future` 类型 struct AsyncFuture { fut_one: FutOne, fut_two: FutTwo, state: State, } -// `async`语句块可能处于的状态 +// `async` 语句块可能处于的状态 enum State { AwaitingFutOne, AwaitingFutTwo, @@ -69,9 +69,9 @@ impl Future for AsyncFuture { } ``` -当`poll`第一次被调用时,它会去查询`fut_one`的状态,若`fut_one`无法完成,则`poll`方法会返回。未来对`poll`的调用将从上一次调用结束的地方开始。该过程会一直持续,直到`Future`完成为止。 +当 `poll` 第一次被调用时,它会去查询 `fut_one` 的状态,若 `fut_one` 无法完成,则 `poll` 方法会返回。未来对 `poll` 的调用将从上一次调用结束的地方开始。该过程会一直持续,直到 `Future` 完成为止。 -然而,如果我们的`async`语句块中使用了引用类型,会发生什么?例如下面例子: +然而,如果我们的 `async` 语句块中使用了引用类型,会发生什么?例如下面例子: ```rust async { let mut x = [0; 128]; @@ -93,12 +93,41 @@ struct AsyncFuture { } ``` -这里,`ReadIntoBuf`拥有一个引用字段,指向了结构体的另一个字段`x`,一旦`AsyncFuture`被移动,那`x`的地址也将随之变化,此时对`x`的引用就变成了不合法的,也就是`read_into_buf_fut.buf`会变为不合法的。 +这里,`ReadIntoBuf` 拥有一个引用字段,指向了结构体的另一个字段 `x` ,一旦 `AsyncFuture` 被移动,那 `x` 的地址也将随之变化,此时对 `x` 的引用就变成了不合法的,也就是 `read_into_buf_fut.buf` 会变为不合法的。 + +若能将 `Future` 在内存中固定到一个位置,就可以避免这种问题的发生,也就可以安全的创建上面这种引用类型。 + +## Unpin +事实上,绝大多数类型都不在意是否被移动(开篇提到的第一种类型),因此它们都**自动实现**了 `Unpin` 特征。 + +从名字推测,大家可能以为 `Pin` 和 `Unpin` 都是特征吧?实际上,`Pin` 不按套路出牌,它是一个结构体: +```rust +pub struct Pin

{ + pointer: P, +} +``` + +它包裹一个指针,并且能确保该指针指向的数据不会被移动,例如 `Pin<&mut T>` , `Pin<&T>` , `Pin>` ,都能确保 `T` 不会被移动。 + + + +而 `Unpin` 才是一个特征,它表明一个类型可以随意被移动,那么问题来了,可以被 `Pin` 住的值,它有没有实现什么特征呢? 答案很出乎意料,可以被 `Pin` 住的值实现的特征是 `!Unpin` ,大家可能之前没有见过,但是它其实很简单,`!` 代表没有实现某个特征的意思,`!Unpin` 说明类型没有实现 `Unpin` 特征,那自然就可以被 `Pin` 了。 + +那是不是意味着类型如果实现了 `Unpin` 特征,就不能被 `Pin` 了?其实,还是可以 `Pin` 的,毕竟它只是一个结构体,你可以随意使用,**但是不再有任何效果而已,该值一样可以被移动**! + +例如 `Pin<&mut u8>` ,显然 `u8` 实现了 `Unpin` 特征,它可以在内存中被移动,因此 `Pin<&mut u8>` 跟 `&mut u8` 实际上并无区别,一样可以被移动。 -若能将`Future`在内存中固定到一个位置,就可以避免这种问题的发生,也就可以安全的创建上面这种引用类型。 +因此,一个类型如果不能被移动,它必须实现 `!Unpin` 特征。如果大家对 `Pin` 、 `Unpin` 还是模模糊糊,建议再重复看一遍之前的内容,理解它们对于我们后面要讲到的内容非常重要! -## 深入理解Pin -对于上面的问题,我们可以简单的归结为如何在Rust中处理自引用类型(果然,只要是难点,都和自引用脱离不了关系),下面用一个稍微简单点的例子来理解下`Pin`: +如果将 `Unpin` 与之前章节学过的 [`Send/Sync`](https://www.zhihu.com/question/303273488/answer/2309266713) 进行下对比,会发现它们都很像: + +- 都是标记特征( marker trait ),该特征未定义任何行为,非常适用于标记 +- 都可以通过!语法去除实现 +- 绝大多数情况都是自动实现, 无需我们的操心 + + +## 深入理解 Pin +对于上面的问题,我们可以简单的归结为如何在 Rust 中处理自引用类型(果然,只要是难点,都和自引用脱离不了关系),下面用一个稍微简单点的例子来理解下 `Pin` : ```rust #[derive(Debug)] struct Test { @@ -130,7 +159,7 @@ impl Test { } ``` -`Test`提供了方法用于获取字段`a`和`b`的值的引用。`b`是`a`的一个引用,但是我们并没有使用引用类型而是用了原生指针,原因是:Rust的借用规则不允许我们这样用,不符合生命周期的要求。此时的`Test`就是一个自引用结构体。 +`Test` 提供了方法用于获取字段 `a` 和 `b` 的值的引用。这里`b` 是 `a` 的一个引用,但是我们并没有使用引用类型而是用了原生指针,原因是:Rust 的借用规则不允许我们这样用,因为不符合生命周期的要求。 此时的 `Test` 就是一个自引用结构体。 如果不移动任何值,那么上面的例子将没有任何问题,例如: ```rust @@ -152,7 +181,7 @@ a: test1, b: test1 a: test2, b: test2 ``` -明知上有虎,偏向虎山行,这才是我辈年轻人的风华。既然移动数据会导致指针不合法,那我们就移动下数据试试,将`test`和`test2`进行下交换: +明知山有虎,偏向虎山行,这才是我辈年轻人的风华。既然移动数据会导致指针不合法,那我们就移动下数据试试,将 `test` 和 `test2` 进行下交换: ```rust fn main() { let mut test1 = Test::new("test1"); @@ -179,7 +208,7 @@ a: test1, b: test1 a: test1, b: test2 ``` -原因是`test2.b`指针依然指向了旧的地址,而该地址现在在`test1`里。因此会打印出意料之外的值。 +原因是 `test2.b` 指针依然指向了旧的地址,而该地址对应的值现在在 `test1` 里,最终会打印出意料之外的值。 如果大家还是将信将疑,那再看看下面的代码: ```rust @@ -201,4 +230,189 @@ fn main() { -## Pin在实践中的运用 \ No newline at end of file +## Pin 在实践中的运用 +在理解了 `Pin` 的作用后,我们再来看看它怎么帮我们解决问题。 + +#### 将值固定到栈上 +回到之前的例子,我们可以用 `Pin` 来解决指针指向的数据被移动的问题: +```rust +use std::pin::Pin; +use std::marker::PhantomPinned; + +#[derive(Debug)] +struct Test { + a: String, + b: *const String, + _marker: PhantomPinned, +} + + +impl Test { + fn new(txt: &str) -> Self { + Test { + a: String::from(txt), + b: std::ptr::null(), + _marker: PhantomPinned, // 这个标记可以让我们的类型自动实现特征`!Unpin` + } + } + + fn init(self: Pin<&mut Self>) { + let self_ptr: *const String = &self.a; + let this = unsafe { self.get_unchecked_mut() }; + this.b = self_ptr; + } + + fn a(self: Pin<&Self>) -> &str { + &self.get_ref().a + } + + fn b(self: Pin<&Self>) -> &String { + assert!(!self.b.is_null(), "Test::b called without Test::init being called first"); + unsafe { &*(self.b) } + } +} +``` + +上面代码中,我们使用了一个标记类型 `PhantomPinned` 将自定义结构体 `Test` 变成了 `!Unpin` (编译器会自动帮我们实现),因此该结构体无法再被移动。 + +一旦类型实现了 `!Unpin` ,那将它的值固定到栈( `stack` )上就是不安全的行为,因此在代码中我们使用了 `unsafe` 语句块来进行处理,你也可以使用 [`pin_utils`](https://docs.rs/pin-utils/) 来避免 `unsafe` 的使用。 + +> BTW, Rust 中的 unsafe 其实没有那么可怕,虽然听上去很不安全,但是实际上 Rust 依然提供了很多机制来帮我们提升了安全性,因此不必像对待 Go 语言的 `unsafe` 那样去畏惧于使用Rust中的 `unsafe` ,大致使用原则总结如下:没必要用时,就不要用,当有必要用时,就大胆用,但是尽量控制好边界,让 `unsafe` 的范围尽可能小 + +此时,再去尝试移动被固定的值,就会导致**编译错误** : +```rust +pub fn main() { + // 此时的`test1`可以被安全的移动 + let mut test1 = Test::new("test1"); + // 新的`test1`由于使用了`Pin`,因此无法再被移动,这里的声明会将之前的`test1`遮蔽掉(shadow) + let mut test1 = unsafe { Pin::new_unchecked(&mut test1) }; + Test::init(test1.as_mut()); + + let mut test2 = Test::new("test2"); + let mut test2 = unsafe { Pin::new_unchecked(&mut test2) }; + Test::init(test2.as_mut()); + + println!("a: {}, b: {}", Test::a(test1.as_ref()), Test::b(test1.as_ref())); + std::mem::swap(test1.get_mut(), test2.get_mut()); + println!("a: {}, b: {}", Test::a(test2.as_ref()), Test::b(test2.as_ref())); +} +``` + +注意到之前的粗体字了吗?是的,Rust 并不是在运行时做这件事,而是在编译期就完成了,因此没有额外的性能开销!来看看报错: +```shell +error[E0277]: `PhantomPinned` cannot be unpinned + --> src/main.rs:47:43 + | +47 | std::mem::swap(test1.get_mut(), test2.get_mut()); + | ^^^^^^^ within `Test`, the trait `Unpin` is not implemented for `PhantomPinned` +``` + +> 需要注意的是固定在栈上非常依赖于你写出的 `unsafe` 代码的正确性。我们知道 `&'a mut T` 可以固定的生命周期是 `'a` ,但是我们却不知道当生命周期 `'a` 结束后,该指针指向的数据是否会被移走。如果你的 `unsafe` 代码里这么实现了,那么就会违背 `Pin` 应该具有的作用! +> +> 一个常见的错误就是忘记去遮蔽(shadow )初始的变量,因为你可以 `drop` 掉 `Pin` ,然后在 `&'a mut T` 结束后去移动数据: +> +> ```rust +> pub fn main() { +> let mut test1 = Test::new("test1"); +> let mut test1 = unsafe { Pin::new_unchecked(&mut test1) }; +> Test::init(test1.as_mut()); +> +> let mut test2 = Test::new("test2"); +> let mut test2 = unsafe { Pin::new_unchecked(&mut test2) }; +> Test::init(test2.as_mut()); +> +> println!("a: {}, b: {}", Test::a(test1.as_ref()), Test::b(test1.as_ref())); +> std::mem::swap(test1.get_mut(), test2.get_mut()); +> println!("a: {}, b: {}", Test::a(test2.as_ref()), Test::b(test2.as_ref())); +>} +>``` + +#### 固定到堆上 +将一个 `!Unpin` 类型的值固定到堆上,会给予该值一个稳定的内存地址,它指向的堆中的值在 `Pin` 后是无法被移动的。而且与固定在栈上不同,我们知道堆上的值在整个生命周期内都会被稳稳地固定住。 + +```rust +use std::pin::Pin; +use std::marker::PhantomPinned; + +#[derive(Debug)] +struct Test { + a: String, + b: *const String, + _marker: PhantomPinned, +} + +impl Test { + fn new(txt: &str) -> Pin> { + let t = Test { + a: String::from(txt), + b: std::ptr::null(), + _marker: PhantomPinned, + }; + let mut boxed = Box::pin(t); + let self_ptr: *const String = &boxed.as_ref().a; + unsafe { boxed.as_mut().get_unchecked_mut().b = self_ptr }; + + boxed + } + + fn a(self: Pin<&Self>) -> &str { + &self.get_ref().a + } + + fn b(self: Pin<&Self>) -> &String { + unsafe { &*(self.b) } + } +} + +pub fn main() { + let test1 = Test::new("test1"); + let test2 = Test::new("test2"); + + println!("a: {}, b: {}",test1.as_ref().a(), test1.as_ref().b()); + println!("a: {}, b: {}",test2.as_ref().a(), test2.as_ref().b()); +} +``` + +#### 将固定住的 `Future` 变为 `Unpin` +之前的章节我们有提到 `async` 函数返回的 `Future` 默认就是 `!Unpin` 的。 + +但是,在实际应用中,一些函数会要求它们处理的 `Future` 是 `Unpin` 的,此时,若你使用的 `Future` 是 `!Unpin` 的,必须要使用以下的方法先将 `Future` 进行固定: + +- `Box::pin`, 创建一个 `Pin>` +- `pin_utils::pin_mut!`, 创建一个 `Pin<&mut T>` + +固定后获得的 `Pin>` 和 `Pin<&mut T>` 既可以用于 `Future` ,**又会自动实现 `Unpin`**。 + +```rust +use pin_utils::pin_mut; // `pin_utils` 可以在crates.io中找到 + +// 函数的参数是一个`Future`,但是要求该`Future`实现`Unpin` +fn execute_unpin_future(x: impl Future + Unpin) { /* ... */ } + +let fut = async { /* ... */ }; +// 下面代码报错: 默认情况下,`fut` 实现的是`!Unpin`,并没有实现`Unpin` +// execute_unpin_future(fut); + +// 使用`Box`进行固定 +let fut = async { /* ... */ }; +let fut = Box::pin(fut); +execute_unpin_future(fut); // OK + +// 使用`pin_mut!`进行固定 +let fut = async { /* ... */ }; +pin_mut!(fut); +execute_unpin_future(fut); // OK +``` + + +## 总结 + +相信大家看到这里,脑袋里已经快被 `Pin` 、 `Unpin` 、 `!Unpin` 整爆炸了,没事,我们再来火上浇油下:) + +- 若 `T: Unpin` ( Rust 类型的默认实现),那么 `Pin<'a, T>` 跟 `&'a mut T` 完全相同,也就是 `Pin` 将没有任何效果, 该移动还是照常移动 +- 绝大多数标准库类型都实现了 `Unpin` ,事实上,对于 Rust 中你能遇到的绝大多数类型,该结论依然成立 +,其中一个例外就是:`async/await` 生成的 `Future` 没有实现 `Unpin` +- 你可以通过以下方法为自己的类型添加 `!Unpin` 约束:1. 使用文中提到的 `std::marker::PhantomPinned` 2. 使用`nightly` 版本下的 `feature flag` +- 可以将值固定到栈上,也可以固定到堆上 + - 将 `!Unpin` 值固定到栈上需要使用 `unsafe` + - 将 `!Unpin` 值固定到堆上无需 `unsafe` ,可以通过 `Box::pin` 来简单的实现 \ No newline at end of file diff --git a/book/contents/img/async-03.png b/book/contents/img/async-03.png new file mode 100644 index 0000000000000000000000000000000000000000..e7e9b65fffaac9d67ac5637e965d9025a7b2c3ab GIT binary patch literal 34163 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