Rust:无法借用Arc中的数据作为可变数据,但内部数据通过Mutex [closed]保护

omvjsjqw  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(125)

**关闭。**此题需要debugging details。目前不接受答复。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将帮助其他人回答这个问题。
7天前关闭
Improve this question
在学习Rust时,尝试通过一个示例,其中需要跨线程和函数共享数据库Db
Link To Minimal Example
我已经将数据库(一个结构体) Package 在一个Arc中,并在结构体中,用一个Mutex保护成员:

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

但是,当我尝试通过关联方法更新Db时,我得到了错误:
help:trait DerefMut需要通过解引用来修改,但Arc<Db>没有实现
我见过this SO post,但我只传递Arc::new(Db),而不是Arc::new(Mutex::new(Db)),因为我知道数据库的内部成员是互斥保护的。

Question如何向编译器指示Db的内部数据成员是访问保护的,才能成功构建Link To Minimal Example?如果可能的话,这是否是一个推荐的方法?
其他信息rustc 1.65.0 (897e37553 2022-11-02)

q7solyqu

q7solyqu1#

目前,您拥有

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

但是,正如您所说,您在Mutex中保护数据库。所以你不需要mut访问:

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

看,Rust中的&mut实际上意味着“独占”或“唯一”访问。Rust将强制&mut引用在编译时是唯一的,这就是它给你这个错误的原因。Mutex只需要一个“共享的”(不可变的)&引用,并在运行时强制执行相同的规则。
删除mut是创建your example work所必需的全部步骤

相关问题