17 个版本 (4 个重大更改)
0.5.1 | 2024年5月29日 |
---|---|
0.4.10 | 2024年4月22日 |
0.4.5 | 2024年3月8日 |
0.4.4 | 2023年10月10日 |
#301 在 并发
每月 205 次下载
用于 24 个 Crates (3 个直接使用)
21KB
500 行
pi_key_alloter
无锁 Key(idx:u32, version:u32) 分配器。
示例
分配键
let alloter = pi_key_alloter::KeyAlloter::new(0);
let k = alloter.alloc();
assert_eq!(0, k.index());
assert_eq!(1, k.version());
alloter.recycle(k);
let k = alloter.alloc();
assert_eq!(0, k.index());
assert_eq!(2, k.version());
let k = alloter.alloc();
assert_eq!(1, k.index());
assert_eq!(1, k.version());
分配器可以用 Arc
在线程间共享
use std::sync::Arc;
fn main() {
let alloter = Arc::new(pi_key_alloter::KeyAlloter::new());
// spawn 6 threads that append to the arr
let threads = (0..6)
.map(|i| {
let alloter = alloter.clone();
std::thread::spawn(move || {
let _ = alloter.alloc();
})
})
.collect::<Vec<_>>();
// wait for the threads to finish
for thread in threads {
thread.join().unwrap();
}
let k = alloter.alloc();
assert_eq!(6, k.index());
assert_eq!(1, k.version());
}
依赖项
~280–470KB