2

我有一个Arc<RwLock<Foo>>.

有没有办法从中做出一些事情,而RwLock's write() 不存在?即是否有某种形式RLock我可以从RwLock.

用例:我有一个Foo. 我的代码中不止一部分需要改变 Foo(因此是 RwLock),但我的大部分代码只能对 Foo 具有只读访问权限。

有没有办法实现这一目标?或者有没有办法做到这一点RwLock

4

1 回答 1

3

编写您自己的包含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<...>>公共类型包含Arc. 与暴露 Arc 相比,您可以提供更多的灵活性来提供什么样的“句柄”。这是 Rust 中相当常见的模式——如果你曾经使用过一个库类型,说明你可以克隆它并为同一事物获取另一个句柄,那么它很有可能在内部做同样的事情(如果它实际上不是句柄到像文件描述符这样的操作系统资源)。

如果你想完全隐藏实现细节,你还需要包装RwLockReadGuard——它需要做的就是实现Deref<Target = Foo>并将其转发给守卫。这样的包装器也可以做一些事情,比如Derefing 的某些部分Foo不是&Foo精确的。

于 2021-12-24T16:46:56.960 回答