我有一个Arc<RwLock<Foo>>。
有没有办法从中制作一些RwLock不存在 write() 的东西?即是否有某种形式RLock我可以从RwLock.
用例:我有一个Foo. 我的代码的不止一部分需要改变 Foo(因此是 RwLock),但我的大部分代码必须只能对 Foo 具有只读访问权限。
有办法实现这一点吗?或者有没有办法做到这一点而不需要RwLock?
编写您自己的包含.Arc<RwLock<Foo>>
#[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}\nRun Code Online (Sandbox Code Playgroud)\n(一个完全充实的版本还将包含 的包装器try_read()。)
这里值得注意的一般模式是:您的Arc<RwLock<...>>公共类型包含. 这使得您可以提供比暴露 Arc 更灵活的 \xe2\x80\x9chandles\xe2\x80\x9d 类型。这是 Rust \xe2\x80\x94\xc2\xa0 中相当常见的模式,如果您曾经使用过一个库类型,说明您可以克隆它并获得同一事物的另一个句柄,那么很有可能它\在里面做同样的事情(如果它实际上不是像文件描述符这样的操作系统资源的句柄)。Arc
如果您想完全隐藏实现细节,您还可以包装RwLockReadGuard\xe2\x80\x94 ,它所需要做的就是实现Deref<Target = Foo>并将其转发给守卫。这样的包装器还可以执行诸如ing的Deref某些部分Foo而不是&Foo精确的操作。
| 归档时间: |
|
| 查看次数: |
1247 次 |
| 最近记录: |