#lock-free #key #pi #alloter

pi_key_alloter

无锁 Key(idx:u32, version:u32) 分配器

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

Download history 146/week @ 2024-04-24 83/week @ 2024-05-01 59/week @ 2024-05-08 69/week @ 2024-05-15 209/week @ 2024-05-22 272/week @ 2024-05-29 71/week @ 2024-06-05 69/week @ 2024-06-12 62/week @ 2024-06-19 59/week @ 2024-06-26 17/week @ 2024-07-03 64/week @ 2024-07-10 64/week @ 2024-07-17 39/week @ 2024-07-24 49/week @ 2024-07-31 50/week @ 2024-08-07

每月 205 次下载
用于 24 个 Crates (3 个直接使用)

MIT/Apache

21KB
500

pi_key_alloter

Crate Github Docs

无锁 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