Rust:不能将 `Arc` 中的数据借用为可变的,但内部数据通过 Mutex 保护

问题描述 投票:0回答:1

在学习 Rust 并尝试完成一个示例时,其中需要跨线程和函数共享数据库

Db

链接到最小示例

我已经将数据库(一个结构)包装在一个

Arc
中,并在该结构中,用一个
Mutex
保护成员:

pub struct Db{
    pub db: Mutex<BTreeMap<String, String>>,
}

但是,尝试通过关联方法更新

Db
时出现错误:

help: trait

DerefMut
需要通过dereference修改,但是对于
Arc<Db>

没有实现

我看过this SO post,但不是

Arc::new(Mutex::new(Db))
,我只通过
Arc::new(Db)
理解数据库的内部成员是互斥保护的。

问题 我如何向编译器指示

Db
的内部数据成员受到访问保护,以便成功构建最小示例链接?如果这是可能的,这是推荐的方法吗?

其他信息

rustc 1.65.0 (897e37553 2022-11-02)

rust mutex automatic-ref-counting
1个回答
0
投票

目前,你有

impl Db {
    pub fn add(&mut self, data: String) -> Option<String> { ... }
}

但是,正如您所说,您在

Mutex
中保护数据库。所以你不需要
mut
访问:

impl Db {
    pub fn add(&self, data: String) -> Option<String> { ... }
}

看,

&mut
在 Rust 中的真正意思是“独占”或“唯一”访问。 Rust 会强制
&mut
引用在编译时是唯一的,这就是它给你那个错误的原因。
Mutex
只需要一个“共享的”(不可变的)
&
引用,并在运行时强制执行相同的规则。

删除

mut
实际上是使您的示例工作所需的全部

© www.soinside.com 2019 - 2024. All rights reserved.