Crates.io | boxcar |
lib.rs | boxcar |
version | 0.2.7 |
source | src |
created_at | 2022-03-13 20:24:50.161442 |
updated_at | 2024-11-07 23:21:37.68118 |
description | A concurrent, append-only vector |
homepage | |
repository | https://github.com/ibraheemdev/boxcar |
max_upload_size | |
id | 549414 |
size | 41,092 |
boxcar
A concurrent, append-only vector.
The vector provided by this crate suports concurrent get
and push
operations. All operations are lock-free.
Appending an element to a vector and retrieving it:
let vec = boxcar::Vec::new();
vec.push(42);
assert_eq!(vec[0], 42);
The vector can be shared across threads with an Arc
:
use std::sync::Arc;
fn main() {
let vec = Arc::new(boxcar::Vec::new());
// spawn 6 threads that append to the vec
let threads = (0..6)
.map(|i| {
let vec = vec.clone();
std::thread::spawn(move || {
vec.push(i); // push through `&Vec`
})
})
.collect::<Vec<_>>();
// wait for the threads to finish
for thread in threads {
thread.join().unwrap();
}
for i in 0..6 {
assert!(vec.iter().any(|(_, &x)| x == i));
}
}
Elements can be mutated through fine-grained locking:
use std::sync::{Mutex, Arc};
fn main() {
let vec = Arc::new(boxcar::Vec::new());
// insert an element
vec.push(Mutex::new(1));
let thread = std::thread::spawn({
let vec = vec.clone();
move || {
// mutate through the mutex
*vec[0].lock().unwrap() += 1;
}
});
thread.join().unwrap();
let x = vec[0].lock().unwrap();
assert_eq!(*x, 2);
}