AsyncReadExt::read_u64 取消安全吗?

Pen*_*gen 5 rust rust-tokio

在它的文档中AsyncReadExt::read_u64说它具有与 相同的错误AsyncReadExt::read_exact,但没有提及取消安全性。read_<type>这同样适用于上的所有其他函数AsyncReadExt。它们似乎具有与read_exact(即没有)相同的取消安全性,但这是真的吗?

是否有另一种方法以取消安全的方式读取接下来的 4 个字节?

Tokio 中有一些东西可以在更高级别上涵盖我的用例,但我想知道我自己将如何做到这一点。

Aid*_*en4 3

不,取消不安全

虽然实现read_exactread_*功能不同,但它们做的事情完全相同:

  1. 将底层轮询AsyncRead到缓冲区中,适当地传播错误。
  2. 如果读者返回Poll::Pending,则传播它。
  3. 如果缓冲区已满,则返回Ok(())
  4. 如果缓冲区未满,请再次重复整个过程。

如果 future 在读取一些字节后被取消,它会使读取器处于未知状态,从而使它们不安全取消。

编辑:使这些方法对象安全是很困难的,唯一的方法是重写方法来执行以下两件事之一:当它被删除时,以某种方式将内部状态传递给外部的侦听器,可能通过通道,或者让未来在被抛弃时以某种方式自行完成。最好重写周围的代码而不依赖于其取消安全性。