#lock-free #key #pi #alloter

pi_key_alloter

lock free Key(idx:u32, version:u32) alloter

15 unstable releases (3 breaking)

new 0.4.10 Apr 22, 2024
0.4.9 Apr 22, 2024
0.4.5 Mar 8, 2024
0.4.4 Oct 10, 2023
0.1.2 Aug 29, 2023

#207 in Concurrency

Download history 155/week @ 2023-12-25 126/week @ 2024-01-01 57/week @ 2024-01-08 30/week @ 2024-01-15 33/week @ 2024-01-22 19/week @ 2024-01-29 41/week @ 2024-02-05 62/week @ 2024-02-12 141/week @ 2024-02-19 90/week @ 2024-02-26 215/week @ 2024-03-04 125/week @ 2024-03-11 74/week @ 2024-03-18 86/week @ 2024-03-25 125/week @ 2024-04-01 7/week @ 2024-04-08

297 downloads per month
Used in 24 crates (3 directly)

MIT/Apache

20KB
504 lines

pi_key_alloter

Crate Github Docs

lock-free Key(idx:u32, version:u32) alloter.

Examples

alloc key:

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());

The alloter can be shared across threads with an 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());
    
}

Dependencies

~280–480KB