#可变 #共享 #引用计数 #对象

我们的

针对共享可变数据的易于使用的、高度泛型包装器

5 个版本 (破坏性更新)

0.5.0 2023 年 2 月 23 日
0.4.0 2023 年 2 月 23 日
0.3.0 2023 年 2 月 23 日
0.2.0 2023 年 2 月 23 日
0.1.0 2023 年 2 月 23 日

#737内存管理

每月 26 次下载

无许可协议

30KB
619

Rust 中共享可变数据的高度泛型包装器。

有关更多信息,请参阅文档


lib.rs:

描述

our 提供了一种高度泛型的共享可变数据抽象。

用法

Shared 是围绕通常具有内部可变性的智能指针的泛型包装器。它提供了一种构建和访问共享可变数据的方法,还提供了一种比较和哈希共享值的方法。

尽管 Shared 通常使用某种类型的内部可变性实现,但 Shared 的方法返回对共享值的写入保护器时,需要 Shared 本身的可变引用。虽然可以通过简单地克隆 Shared 来轻松规避这种情况,但这样实现是为了尝试在编译时防止意外获取两个排他性保护器,这会对非线程安全的 Shared 引发恐慌,对线程安全的 Shared 导致死锁。

Shared 有三个类型参数

  • 共享值的类型
  • 一个 ShareKind,它决定了如何构建和访问共享值
  • ShareUnsync 是一个非线程安全的共享值,实现为 Rc<RefCell<T>>
  • ShareSync 是一个线程安全的共享值,实现为 Arc<parking_lot::RwLock<T>>
  • 一种通常实现 PartialEqKindEqKindPartialOrdKindOrdKindHashKind 的类型,这些类型决定了共享值如何进行比较和哈希。
  • ByRef 通过引用进行比较和哈希
  • ByVal 通过值进行比较和哈希

类型别名

为了方便,提供了四个 Shared 类型别名

非线程安全 线程安全
通过引用比较 UnsyncByRef SyncByRef
通过值比较 UnsyncByVal SyncByVal

示例

use our::*;

// `SyncByRef` is a thread-safe shared value with by-reference comparison and hashing.
let mut a = SyncByRef::new(0);
let mut b = a.clone();
std::thread::spawn(move || b.set(1)).join().unwrap();
assert_eq!(a.get(), 1);
let c = SyncByRef::new(1);
assert_ne!(a, c); // Notice that while while `a` and `c` both equal `1`,
// they do not compare equal because they are different
// pointers.

// `UnsyncByVal` is a non-thread-safe shared value with by-value comparison and hashing.
let a = UnsyncByVal::new(5);
let b = UnsyncByVal::new(5);
assert_eq!(a, b); // Notice that `a` and `b` compare equal
// even though they are different pointers.

依赖项

~0.4–6MB
~11K SLoC