0

我正在玩这个玩具结构:

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,
}

我的理论是在 of 周围有一个,Arc然后我可以有多个写入器,这些写入器可以独立/同时修改via的和字段。RwLockCommunityRwLockfriendsindexCommunityContentsRc<RefCell

这甚至可能吗?RwLock无论如何,一次只允许一个以上的作家 - 在这种情况下,我应该删除并RefCells简化整个结构?

4

1 回答 1

1

不。

Arc不允许它持有的类型的突变。只有不可变的引用可以共享,Arc没有什么不同。

来自Arc文档:

默认情况下,Rust 中的共享引用不允许突变,Arc 也不例外:您通常无法获得对 Arc 中某些内容的可变引用。如果您需要通过 Arc 进行变异,请使用 Mutex、RwLock 或其中一种 Atomic 类型。

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

来自RwLock文档:

这种类型的锁在任何时间点允许多个读取器或最多一个写入器。

无论您做什么,都无法使用安全 Rust 在两个不同的地方获得可变引用,唯一的方法是 using unsafe {},这无论如何都会导致未定义的行为,像RwLockdo use这样的类型unsafe {},但是,它们保证写入(可变访问)是独占的,实际上,如果有人在写它就无法读取,如果有人在读它,它就无法写入,这就是这句话的意思。

于 2019-08-06T10:49:21.963 回答