rust - 为什么 futures::lock::Mutex 没有实现 RefUnwindSafe
问题描述
futures::lock::Mutex
没有实现RefUnwindSafe
特征(参见https://docs.rs/futures/0.3.17/futures/lock/struct.Mutex.html#impl-RefUnwindSafe)
为什么不安全通过一个futures::lock::Mutex
里面std::panic::catch_unwind
?
可重现的代码:
use std::panic::catch_unwind;
use futures::lock::Mutex;
fn main() {
let m = Mutex::new(String::new());
catch_unwind(|| {
m.lock()
});
}
可以futures::lock::Mutex
实现RefUnwindSafe
trait 吗?
解决方案
该UnwindSafe
特征的文档暗示了这样做的原因:
谁实施 UnwindSafe?
&mut T 和 &RefCell 等类型是非展开安全的示例。一般的想法是,任何可以在 catch_unwind 之间共享的可变状态在默认情况下都不是安全的。这是因为在 catch_unwind 之外很容易看到损坏的不变量,因为数据只是照常访问。
然而,像 &Mutex 这样的类型是安全的,因为它们默认实现中毒。他们仍然允许目睹一个损坏的不变量,但他们已经提供了自己的“减速带”来这样做。
futures::lock::Mutex
&mut T
提供了类似and的可变性RefCell<T>
,但没有实现 的中毒特性std::sync::Mutex<T>
,所以它没有实现UnwindSafe
.
尽管正如文档所指出的那样,这UnwindSafe
与内存安全性无关,而更多地与维护逻辑不变量有关——因此为什么既不是UnwindSafe
也不AssertUnwindSafe
是unsafe
。
推荐阅读
- reactjs - 是否可以将道具从 React Link 传递到功能组件?
- paypal - 已解决 - 我的 PayPal 支付数据传输 (PDT) 身份令牌在哪里?2020
- progressive-web-apps - 独立的Web应用程序,当应用程序从后台返回时相机是黑色的?
- javascript - 从 API Node JS 获取不正确的数据
- c# - 如何使用 python .Net vs ZeroMQ 或其他方法将 Python 包公开给 C#
- excel - vba如何检查过滤器是否给出结果(可见属性包括标题)
- mysql - docker-compose 的“db”服务中 MYSQL_PASSWORD 的插值格式错误
- android - Android:更换片段时如何停止音乐?
- python - 在 Django 中为我的 PostgreSQL 连接设置纯文本密码是否安全?
- javascript - 如何使用 for 循环进行绑定