9个版本
0.1.8 | 2023年2月8日 |
---|---|
0.1.7 | 2023年2月5日 |
0.1.6 | 2019年1月15日 |
0.1.3 | 2018年12月31日 |
#229 在 内存管理 中
31KB
546 行
rcu-clean

此crate提供易于使用的智能指针,具有内部可变性。这些智能指针使用RCU来允许多次读取和更新。它们实现了读取的Deref
,这使得它们在读取时既方便(人体工程学)又快,特别是对于通常需要使用Mutex
或RwLock
来读取指针的Arc
版本。缺点是,只有在你对每个指针副本都调用了clean
方法时,旧版本的数据才会被释放。
lib.rs
:
此crate提供一组(最终)智能指针类型,允许无守卫(和最小到无开销)的读取访问,无需调用std::borrow::Borrow。这些智能指针各自通过读取-复制-更新方法实现内部可变性(获取可变引用),因此您可以获取数据的私有副本的可变引用,可以随意对其进行修改。当修改完成后,指针将原子更新。旧的数据引用可能仍然存在,并且仍然是旧数据的有效引用。
基本上,这些智能指针通过缓慢而痛苦的过程允许内部可变性,同时保持只读访问既快又简单(特别是不需要在所有地方调用ptr.borrow()
)。写入访问受到保护,但读取访问不受保护。
类型的名称基于标准智能指针类型。
-
[BoxRcu]
是一个类似于 std::box::Box 的所有者指针。如果您愿意,它实际上更接近于Box<RefCell<T>>
,甚至是Box<Mutex<T>>
,但无需在读取时调用借用。 -
[RcRcu]
是一个类似于 std::rc::Rc 的引用计数指针。如果您愿意,它实际上更接近于Rc<RefCell<T>>
,但无需在读取时调用借用。 -
ArcRcu
计划成为一个类似于 std::sync::Arc 的线程安全引用计数指针。它实际上更接近于Arc<RwLock<T>>
,但无需在读取前调用read
。
清理
由于这个crate的读取-复制-更新语义,旧数据副本会一直保留,直到我们确信没有更多引用指向它们。因为我们没有对读取引用进行保护,所以这必须手动完成。这是我们为了额外便利(以及ArcRcu情况下的读取速度大幅提升)在读取操作上付出的代价。您有两种处理方法。
一种方法是简单地存储这些额外的副本,直到整个智能指针本身被释放。这就是您不采取任何行动时会发生的情况,对于只被修改一次的小数据,这是一个不错的选择。然而,对于 [ArcRcu]
和 [RcRcu]
,在您调用清理之前,读取会有所减慢,因为需要额外的指针重定向级别。
另一种方法是方便时调用 clean()
。 clean
接受一个 &mut self
,因此当它被调用时,编译器将向我们证明没有其他引用通过 这个 智能指针存在。对于 BoxCell
,这足以证明我们可以释放数据。对于引用计数的数据指针,我们记录自上次调用 clean
以来解引用的副本数。我们可能可以通过“时期”跟踪来更准确,但我不知道这种复杂性是否值得。
依赖项
~215KB