8 releases

0.2.7 Nov 7, 2024
0.2.6 Oct 3, 2024
0.2.5 May 1, 2024
0.2.4 Nov 1, 2023
0.1.0 Mar 13, 2022

#117 in Concurrency

Download history 3479/week @ 2024-08-22 3492/week @ 2024-08-29 3414/week @ 2024-09-05 2539/week @ 2024-09-12 2903/week @ 2024-09-19 3329/week @ 2024-09-26 3773/week @ 2024-10-03 3087/week @ 2024-10-10 3341/week @ 2024-10-17 3817/week @ 2024-10-24 4097/week @ 2024-10-31 4402/week @ 2024-11-07 5465/week @ 2024-11-14 6198/week @ 2024-11-21 7268/week @ 2024-11-28 7922/week @ 2024-12-05

27,670 downloads per month
Used in 55 crates (16 directly)

MIT license

34KB
576 lines

boxcar

crates.io github docs.rs

A concurrent, append-only vector.

The vector provided by this crate suports concurrent get and push operations. All operations are lock-free.

Examples

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);
}

No runtime deps