17 releases (4 breaking)
0.5.1 | May 29, 2024 |
---|---|
0.4.10 | Apr 22, 2024 |
0.4.5 | Mar 8, 2024 |
0.4.4 | Oct 10, 2023 |
#172 in Memory management
117 downloads per month
Used in 24 crates
(3 directly)
21KB
500 lines
pi_key_alloter
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
~275–460KB