23 releases
| 0.6.4 | Jul 30, 2025 |
|---|---|
| 0.6.1 | Apr 24, 2025 |
| 0.6.0 | Mar 12, 2025 |
| 0.5.2 | Aug 14, 2025 |
| 0.4.4 | Oct 10, 2023 |
#581 in Concurrency
108 downloads per month
Used in 40 crates
(3 directly)
22KB
564 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
~280–465KB