我正在玩这个玩具结构:
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,
}
我的理论是在
Arc
的RwLock
周围有一个Community
,然后我可以有多个RwLock
编写者,这些编写者可以通过friends
独立/同时修改index
的CommunityContents
和Rc<RefCell
字段。这有可能吗?不管怎样,
RwLock
一次将不允许一次写多个文档吗?在这种情况下,我应该删除RefCells
并简化整个结构? 最佳答案
不。Arc
不允许对其持有的类型进行突变。只能共享不可变的引用,并且Arc
没什么不同。
从 Arc
文档:
这意味着您必须存储一个具有内部可变性的类型... RwLock
是这些类型之一,并且无论是否包装在Arc
中,它的行为都相同。
从 RwLock
文档:
无论您做什么,都不可能使用安全的Rust在两个不同的地方获取可变引用,唯一的方法是使用unsafe {}
,无论如何都会导致未定义的行为,像RwLock
这样的类型也确实使用unsafe {}
,但是,它们保证了写入(可变访问) )是排他性的,实际上,如果有人在写它,则无法读取它;如果有人在阅读它,则无法写入它,这就是该句子的意思。