6个版本
0.1.5 | 2024年7月19日 |
---|---|
0.1.4 | 2024年6月22日 |
0.1.3 | 2023年9月3日 |
0.1.2 | 2022年3月29日 |
#126 in 并发
8,073 每月下载次数
用于 18 个crates (12直接)
17KB
251 行
Append-only-vec
注意:目前CI频繁失败,这仅仅是由于无法安装miri来运行测试。当本地运行时,测试是可以通过的。
此crate定义了一个简单的单一数据结构,这是一个只能追加数据的向量。它允许你在有未解决的引用到AppendOnlyVec
的元素时,仍然推送新的数据值。从AppendOnlyVec
读取要比被std::sync::RwLock
保护的情况快得多。
lib.rs
:
AppendOnlyVec
这是一个相当简单的类型,你可以向其中推送,但不能修改其元素。数据结构一旦分配了元素就永远不会移动,因此你可以在持有已推送元素的引用的同时向向量中推送。
可伸缩性
-
访问一个元素是O(1),但比标准的
Vec
要稍微昂贵一点。 -
推送一个新元素平均到O(1),但可能需要分配一个新块。
示例
use append_only_vec::AppendOnlyVec;
static V: AppendOnlyVec<String> = AppendOnlyVec::<String>::new();
let mut threads = Vec::new();
for thread_num in 0..10 {
threads.push(std::thread::spawn(move || {
for n in 0..100 {
let s = format!("thread {} says {}", thread_num, n);
let which = V.push(s.clone());
assert_eq!(&V[which], &s);
}
}));
}
for t in threads {
t.join();
}
assert_eq!(V.len(), 1000);