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_*
函数的实现不同,但它们做的事情完全相同:
- 将底层
AsyncRead
轮询到缓冲区中,适当地传播错误。
- 如果 reader returns
Poll::Pending
,传播那个。
- 如果缓冲区已满,return
Ok(())
.
- 如果缓冲区未满,请再次重复整个过程。
如果未来在读取一些字节后被取消,它会使 reader 处于未知状态,从而使它们无法取消安全。
编辑:让这些方法对象安全是困难的,唯一的方法是重写方法来做两件事之一:当它被删除时,以某种方式将内部状态传达给外部的监听器,可能是通过一个渠道,或者让未来以某种方式 运行 在它被丢弃时自己完成。最好重写周围的代码,使其不依赖于它的取消安全性。
在 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_*
函数的实现不同,但它们做的事情完全相同:
- 将底层
AsyncRead
轮询到缓冲区中,适当地传播错误。 - 如果 reader returns
Poll::Pending
,传播那个。 - 如果缓冲区已满,return
Ok(())
. - 如果缓冲区未满,请再次重复整个过程。
如果未来在读取一些字节后被取消,它会使 reader 处于未知状态,从而使它们无法取消安全。
编辑:让这些方法对象安全是困难的,唯一的方法是重写方法来做两件事之一:当它被删除时,以某种方式将内部状态传达给外部的监听器,可能是通过一个渠道,或者让未来以某种方式 运行 在它被丢弃时自己完成。最好重写周围的代码,使其不依赖于它的取消安全性。