首页 > 解决方案 > 为什么 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实现RefUnwindSafetrait 吗?

标签: rustrust-tokiorust-futures

解决方案


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也不AssertUnwindSafeunsafe


推荐阅读