< 返回版块

aariety 发表于 2021-08-15 11:47

Tags:pin, future

根据 rust 异步原理,async 块生成的 Future 实现内部可能会存在自引用。所以 poll 方法只接受被“pin”住的 Future

可是直到 poll 方法被调用前,Future 是可以不被“pin”的,也就可以随意地在方法之间 move。一旦其被 move,那结构内部的自引用不就应该失效了吗?

但实际上,tokio 和 async-std 内的 spawnblock_on 等方法接受的都是裸露的 Future,无需被 Pin 包裹。为什么这种 move 是安全的呢?

评论区

写评论
作者 aariety 2021-08-15 19:47

原来如此,感谢感谢!

--
👇
catsalwaysmeow: > 一旦其被 move,那结构内部的自引用不就应该失效了吗?

在一个impl Futurepoll前,它是完全没有开始执行的,其内部的变量们还没有被初始化,也就没有「自引用」的存在。它在被传入block_on之后,会被pin住,然后调用第一次poll。在第一次poll结束后,它才有可能成为一个「自引用结构」。但此时它已经被pin住,没有办法再被move了。

catsalwaysmeow 2021-08-15 19:15

一旦其被 move,那结构内部的自引用不就应该失效了吗?

在一个impl Futurepoll前,它是完全没有开始执行的,其内部的变量们还没有被初始化,也就没有「自引用」的存在。它在被传入block_on之后,会被pin住,然后调用第一次poll。在第一次poll结束后,它才有可能成为一个「自引用结构」。但此时它已经被pin住,没有办法再被move了。

1 共 2 条评论, 1 页