我有一个Arc<RwLock<Foo>>
.
有没有办法从中做出一些事情,而RwLock
's 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<...>>
公共类型包含Arc
. 与暴露 Arc 相比,您可以提供更多的灵活性来提供什么样的“句柄”。这是 Rust 中相当常见的模式——如果你曾经使用过一个库类型,说明你可以克隆它并为同一事物获取另一个句柄,那么它很有可能在内部做同样的事情(如果它实际上不是句柄到像文件描述符这样的操作系统资源)。
如果你想完全隐藏实现细节,你还需要包装RwLockReadGuard
——它需要做的就是实现Deref<Target = Foo>
并将其转发给守卫。这样的包装器也可以做一些事情,比如Deref
ing 的某些部分而Foo
不是&Foo
精确的。