**关闭。**此题需要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)
1条答案
按热度按时间q7solyqu1#
目前,您拥有
但是,正如您所说,您在
Mutex
中保护数据库。所以你不需要mut
访问:看,Rust中的
&mut
实际上意味着“独占”或“唯一”访问。Rust将强制&mut
引用在编译时是唯一的,这就是它给你这个错误的原因。Mutex
只需要一个“共享的”(不可变的)&
引用,并在运行时强制执行相同的规则。删除
mut
是创建your example work所必需的全部步骤