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

fad*_*bee 5 rust rwlock

我有一个Arc<RwLock<Foo>>

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

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

有办法实现这一点吗?或者有没有办法做到这一点而不需要RwLock

Kev*_*eid 4

编写您自己的包含.Arc<RwLock<Foo>>

\n
#[derive(Clone, Debug)]\npub struct FooReadOnly(Arc<RwLock<Foo>>);\n\nimpl FooReadOnly {\n    pub fn read(&self) -> LockResult<RwLockReadGuard<\'_, Foo>> {\n        self.0.read()\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

(一个完全充实的版本还将包含 的包装器try_read()。)

\n

这里值得注意的一般模式是:您Arc<RwLock<...>>公共类型包含. 这使得您可以提供比暴露 Arc 更灵活的 \xe2\x80\x9chandles\xe2\x80\x9d 类型。这是 Rust \xe2\x80\x94\xc2\xa0 中相当常见的模式,如果您曾经使用过一个库类型,说明您可以克隆它并获得同一事物的另一个句柄,那么很有可能它\在里面做同样的事情(如果它实际上不是像文件描述符这样的操作系统资源的句柄)。Arc

\n

如果您想完全隐藏实现细节,您还可以包装RwLockReadGuard\xe2\x80\x94 ,它所需要做的就是实现Deref<Target = Foo>并将其转发给守卫。这样的包装器还可以执行诸如ing的Deref某些部分Foo而不是&Foo精确的操作。

\n