35 releases (17 breaking)

0.18.2 Mar 15, 2024
0.17.1 Feb 21, 2024
0.14.0 Dec 29, 2023
0.11.2 Oct 27, 2023

#419 in Concurrency

Download history 7/week @ 2023-12-31 1/week @ 2024-01-07 19/week @ 2024-01-21 18/week @ 2024-01-28 312/week @ 2024-02-18 80/week @ 2024-02-25 16/week @ 2024-03-03 379/week @ 2024-03-10 67/week @ 2024-03-17 2/week @ 2024-03-24 37/week @ 2024-03-31 6/week @ 2024-04-07 9/week @ 2024-04-14

64 downloads per month
Used in 3 crates

MIT/Apache

40KB
793 lines

pi_arr

Crate Github Docs

Multi thread safe array structure, auto-expansion array. All operations are lock-free.

Examples

set an element to a arr and retrieving it:

let arr = pi_arr::Arr::new();
arr.set(0, 42);
assert_eq!(arr[0], 42);

The arr can be shared across threads with an Arc:

use std::sync::Arc;

fn main() {
    let arr = Arc::new(pi_arr::Arr::new());

    // spawn 6 threads that append to the arr
    let threads = (0..6)
        .map(|i| {
            let arr = arr.clone();

            std::thread::spawn(move || {
                arr.set(i, i);
            })
        })
        .collect::<Vec<_>>();

    // wait for the threads to finish
    for thread in threads {
        thread.join().unwrap();
    }

    for i in 0..6 {
        assert!(arr.iter().any(|(_, &x)| x == i));
    }
}

Elements can be mutated through fine-grained locking:

use std::sync::{Mutex, Arc};

fn main() {
    let arr = Arc::new(pi_arr::Arr::new());

    // insert an element
    arr.set(0, Mutex::new(1));

    let thread = std::thread::spawn({
        let arr = arr.clone();
        move || {
            // mutate through the mutex
            *arr[0].lock().unwrap() += 1;
        }
    });

    thread.join().unwrap();

    let x = arr[0].lock().unwrap();
    assert_eq!(*x, 2);
}

Dependencies

~180KB