我正在玩这个玩具结构:

pub struct Community {
    pub community_contents: RwLock<CommunityContents>,
}

pub struct CommunityContents {
    pub friends: RefCell<HashMap<FriendID, FriendData>>,
    pub index: RefCell<HashMap<u64, BTreeMap<FriendID, FriendData>>>,
    pub authenticated: bool,
    pub age: u64,
    pub height: u64,
}

我的理论是在ArcRwLock周围有一个Community,然后我可以有多个RwLock编写者,这些编写者可以通过friends独立/同时修改indexCommunityContentsRc<RefCell字段。

这有可能吗?不管怎样,RwLock一次将不允许一次写多个文档吗?在这种情况下,我应该删除RefCells并简化整个结构?

最佳答案

不。
Arc不允许对其持有的类型进行突变。只能共享不可变的引用,并且Arc没什么不同。

Arc 文档:



这意味着您必须存储一个具有内部可变性的类型... RwLock是这些类型之一,并且无论是否包装在Arc中,它的行为都相同。

RwLock 文档:



无论您做什么,都不可能使用安全的Rust在两个不同的地方获取可变引用,唯一的方法是使用unsafe {},无论如何都会导致未定义的行为,像RwLock这样的类型也确实使用unsafe {},但是,它们保证了写入(可变访问) )是排他性的,实际上,如果有人在写它,则无法读取它;如果有人在阅读它,则无法写入它,这就是该句子的意思。

10-07 23:32