An open API service indexing awesome lists of open source software.

https://github.com/ibraheemdev/boxcar

A concurrent, append-only vector.
https://github.com/ibraheemdev/boxcar

Last synced: about 1 year ago
JSON representation

A concurrent, append-only vector.

Awesome Lists containing this project

README

          

# `boxcar`

[crates.io](https://crates.io/crates/boxcar)
[github](https://github.com/ibraheemdev/boxcar)
[docs.rs](https://docs.rs/boxcar)

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:

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

The vector can be modified by multiple threads concurrently:

```rust
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:

```rust
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);
```