我是否需要使用某种内部可变性来创建两个弧之间的循环?
Do I need to use some kind of interior mutability to create a cycle between two Arcs?
我有一棵树,我希望树的每个节点都有一个指向其父节点的指针。
struct DataDeclaration {
parent: Option<Arc<DataDeclaration>>,
children: Option<Vec<Weak<DataDeclaration>>>,
properties: HashMap<Identifier, DataDeclarationProperty>,
}
这会产生一个循环,所以我使用 Weak
来确保内存不会无限期地存在。这棵树在我的应用程序的整个长度内都是不可变的,当然,在构建树时除外。
为了创建这棵树,我需要使用标准库中的 Mutex
或 RwLock
还是 parking_lot
?如果我只使用锁进行读取,是否会对性能产生负面影响?
do I need to use a Mutex
or RwLock
是的。
没有实用的方法可以让类型在构造时暂时可变,然后 "jettisoning" 能够在一段时间内发生变异(直到需要再次变为可变时破坏)
Will there be a negative performance impact
是的。
影响有意义或重要吗?这取决于整个程序范围之外无法回答的一大堆因素和一组特定的用法。
如果使用 Mutex
而不是 RwLock
,影响可能会更大,因为 Mutex
一次只允许一个线程访问。 RwLock
将允许多个并发线程。
另请参阅:
此处的所有内容也适用于 single-threaded 上下文,将 Arc
替换为 Rc
,将 RwLock
替换为 RefCell
。
我有一棵树,我希望树的每个节点都有一个指向其父节点的指针。
struct DataDeclaration {
parent: Option<Arc<DataDeclaration>>,
children: Option<Vec<Weak<DataDeclaration>>>,
properties: HashMap<Identifier, DataDeclarationProperty>,
}
这会产生一个循环,所以我使用 Weak
来确保内存不会无限期地存在。这棵树在我的应用程序的整个长度内都是不可变的,当然,在构建树时除外。
为了创建这棵树,我需要使用标准库中的 Mutex
或 RwLock
还是 parking_lot
?如果我只使用锁进行读取,是否会对性能产生负面影响?
do I need to use a
Mutex
orRwLock
是的。
没有实用的方法可以让类型在构造时暂时可变,然后 "jettisoning" 能够在一段时间内发生变异(直到需要再次变为可变时破坏)
Will there be a negative performance impact
是的。
影响有意义或重要吗?这取决于整个程序范围之外无法回答的一大堆因素和一组特定的用法。
如果使用 Mutex
而不是 RwLock
,影响可能会更大,因为 Mutex
一次只允许一个线程访问。 RwLock
将允许多个并发线程。
另请参阅:
此处的所有内容也适用于 single-threaded 上下文,将 Arc
替换为 Rc
,将 RwLock
替换为 RefCell
。