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内存管理

Apache-2.0/MIT

31KB
546

rcu-clean 最新版本 文档 构建状态

此crate提供易于使用的智能指针,具有内部可变性。这些智能指针使用RCU来允许多次读取和更新。它们实现了读取的Deref,这使得它们在读取时既方便(人体工程学)又快,特别是对于通常需要使用MutexRwLock来读取指针的Arc版本。缺点是,只有在你对每个指针副本都调用了clean方法时,旧版本的数据才会被释放。


lib.rs:

此crate提供一组(最终)智能指针类型,允许无守卫(和最小到无开销)的读取访问,无需调用std::borrow::Borrow。这些智能指针各自通过读取-复制-更新方法实现内部可变性(获取可变引用),因此您可以获取数据的私有副本的可变引用,可以随意对其进行修改。当修改完成后,指针将原子更新。旧的数据引用可能仍然存在,并且仍然是旧数据的有效引用。

基本上,这些智能指针通过缓慢而痛苦的过程允许内部可变性,同时保持只读访问既快又简单(特别是不需要在所有地方调用ptr.borrow())。写入访问受到保护,但读取访问不受保护。

类型的名称基于标准智能指针类型。

  1. [BoxRcu] 是一个类似于 std::box::Box 的所有者指针。如果您愿意,它实际上更接近于 Box<RefCell<T>>,甚至是 Box<Mutex<T>>,但无需在读取时调用借用。

  2. [RcRcu] 是一个类似于 std::rc::Rc 的引用计数指针。如果您愿意,它实际上更接近于 Rc<RefCell<T>>,但无需在读取时调用借用。

  3. ArcRcu 计划成为一个类似于 std::sync::Arc 的线程安全引用计数指针。它实际上更接近于 Arc<RwLock<T>>,但无需在读取前调用 read

清理

由于这个crate的读取-复制-更新语义,旧数据副本会一直保留,直到我们确信没有更多引用指向它们。因为我们没有对读取引用进行保护,所以这必须手动完成。这是我们为了额外便利(以及ArcRcu情况下的读取速度大幅提升)在读取操作上付出的代价。您有两种处理方法。

一种方法是简单地存储这些额外的副本,直到整个智能指针本身被释放。这就是您不采取任何行动时会发生的情况,对于只被修改一次的小数据,这是一个不错的选择。然而,对于 [ArcRcu][RcRcu],在您调用清理之前,读取会有所减慢,因为需要额外的指针重定向级别。

另一种方法是方便时调用 clean()clean 接受一个 &mut self,因此当它被调用时,编译器将向我们证明没有其他引用通过 这个 智能指针存在。对于 BoxCell,这足以证明我们可以释放数据。对于引用计数的数据指针,我们记录自上次调用 clean 以来解引用的副本数。我们可能可以通过“时期”跟踪来更准确,但我不知道这种复杂性是否值得。

依赖项

~215KB