Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

ibraheemdev/boxcar

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

94 Commits

Repository files navigation

boxcar

crates.io github docs.rs

A concurrent, append-only vector.

The vector provided by this crate supports lock-free get and push operations. The vector grows internally but never reallocates, so element addresses are stable for the lifetime of the vector. Additionally, both get and push run in constant-time.

Examples

Appending an element to a vector and retrieving it:

let vec = boxcar::Vec::new();
let i = vec.push(42);
assert_eq!(vec[i], 42);

The vector can be modified by multiple threads concurrently:

let vec = boxcar::Vec::new();
// Spawn a few threads that append to the vector.
std::thread::scope(|s| for i in 0..6 {
 let vec = &vec;
 s.spawn(move || {
 // Push through the shared reference.
 vec.push(i);
 });
});
for i in 0..6 {
 assert!(vec.iter().any(|(_, &x)| x == i));
}

Elements can be mutated through fine-grained locking:

let vec = boxcar::Vec::new();
std::thread::scope(|s| {
 // Insert an element.
 vec.push(std::sync::Mutex::new(0));
 s.spawn(|| {
 // Mutate through the lock.
 *vec[0].lock().unwrap() += 1;
 });
});
let x = vec[0].lock().unwrap();
assert_eq!(*x, 1);

About

A concurrent, append-only vector.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 10

Languages

AltStyle によって変換されたページ (->オリジナル) /