获取 Arc<RwLock<Foo>> 的只读版本?

Getting a read-only version of an Arc<RwLock<Foo>>?

我有一个Arc<RwLock<Foo>>

有没有办法从中得到一些东西,RwLock 的 write() 不存在?即是否有某种形式的 RLock 我可以从 RwLock.

用例:我有一个Foo。我的代码的不止一部分需要改变 Foo(因此需要 RwLock),但我的大部分代码必须只能对 Foo 进行只读访问。

有办法实现吗?或者有没有 RwLock 的方法?

编写您自己的结构,包含 Arc<RwLock<Foo>>

#[derive(Clone, Debug)]
pub struct FooReadOnly(Arc<RwLock<Foo>>);

impl FooReadOnly {
    pub fn read(&self) -> LockResult<RwLockReadGuard<'_, Foo>> {
        self.0.read()
    }

}

(一个完整的版本也会包含 try_read() 的包装器。)

这里值得注意的一般模式是:您的数据类型不是 可见 Arc<RwLock<...>> 中,而是您的 public 类型 包含 Arc。与暴露 Arc 相比,这使您可以更灵活地选择可以提供的“句柄”类型。这是 Rust 中相当常见的模式——如果您曾经使用过一个库类型,说明您可以克隆它并获得同一事物的另一个句柄,那么它很有可能在内部做同样的事情(如果它实际上不是一个句柄到 OS 资源,如文件描述符)。

如果你想完全隐藏实现细节,你也可以包装 RwLockReadGuard — 它需要做的就是实现 Deref<Target = Foo> 并将其转发给守卫。这样的包装器还可以对 Foo 的某些 部分 而不是 &Foo 进行 Deref 之类的操作。