AsyncReadExt::read_u64 取消安全吗?

Is AsyncReadExt::read_u64 cancel safe?

AsyncReadExt::read_u64 it says it has the same errors as AsyncReadExt::read_exact 的文档中,但未提及取消安全性。 AsyncReadExt 上的所有其他 read_<type> 函数也是如此。 它们似乎具有与 read_exact(即 none)相同的取消安全性,但这是真的吗?

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

Tokio 中的一些内容涵盖了更高级别的我的用例,但我想知道我自己将如何做到这一点。

不,这不是安全取消

虽然 read_exact and the read_* 函数的实现不同,但它们做的事情完全相同:

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

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

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