获取 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
之类的操作。
我有一个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
之类的操作。