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 并发

Download history 1327/week @ 2024-05-03 1157/week @ 2024-05-10 1598/week @ 2024-05-17 1262/week @ 2024-05-24 1133/week @ 2024-05-31 1516/week @ 2024-06-07 1163/week @ 2024-06-14 1567/week @ 2024-06-21 1595/week @ 2024-06-28 1608/week @ 2024-07-05 2154/week @ 2024-07-12 1642/week @ 2024-07-19 1256/week @ 2024-07-26 1833/week @ 2024-08-02 2217/week @ 2024-08-09 2518/week @ 2024-08-16

8,073 每月下载次数
用于 18 个crates (12直接)

MIT/Apache

17KB
251

Append-only-vec

Latest version Documentation Build Status

注意:目前CI频繁失败,这仅仅是由于无法安装miri来运行测试。当本地运行时,测试是可以通过的。

此crate定义了一个简单的单一数据结构,这是一个只能追加数据的向量。它允许你在有未解决的引用到AppendOnlyVec的元素时,仍然推送新的数据值。从AppendOnlyVec读取要比被std::sync::RwLock保护的情况快得多。


lib.rs:

AppendOnlyVec

这是一个相当简单的类型,你可以向其中推送,但不能修改其元素。数据结构一旦分配了元素就永远不会移动,因此你可以在持有已推送元素的引用的同时向向量中推送。

可伸缩性

  1. 访问一个元素是O(1),但比标准的Vec要稍微昂贵一点。

  2. 推送一个新元素平均到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);

无运行时依赖