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>>
- 一种通常实现
PartialEqKind
、EqKind
、PartialOrdKind
、OrdKind
和HashKind
的类型,这些类型决定了共享值如何进行比较和哈希。 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