在它的文档中AsyncReadExt::read_u64说它具有与 相同的错误AsyncReadExt::read_exact,但没有提及取消安全性。read_<type>这同样适用于上的所有其他函数AsyncReadExt。它们似乎具有与read_exact(即没有)相同的取消安全性,但这是真的吗?
是否有另一种方法以取消安全的方式读取接下来的 4 个字节?
Tokio 中有一些东西可以在更高级别上涵盖我的用例,但我想知道我自己将如何做到这一点。
虽然实现read_exact和read_*功能不同,但它们做的事情完全相同:
AsyncRead到缓冲区中,适当地传播错误。Poll::Pending,则传播它。Ok(())。如果 future 在读取一些字节后被取消,它会使读取器处于未知状态,从而使它们不安全取消。
编辑:使这些方法对象安全是很困难的,唯一的方法是重写方法来执行以下两件事之一:当它被删除时,以某种方式将内部状态传递给外部的侦听器,可能通过通道,或者让未来在被抛弃时以某种方式自行完成。最好重写周围的代码而不依赖于其取消安全性。