43个版本 (18个破坏性版本)

0.19.6 2024年6月19日
0.19.0 2024年5月31日
0.18.2 2024年3月15日
0.14.0 2023年12月29日
0.11.2 2023年10月27日

#178 in 并发

Download history 5/week @ 2024-05-17 169/week @ 2024-05-24 575/week @ 2024-05-31 317/week @ 2024-06-07 241/week @ 2024-06-14 34/week @ 2024-06-21 99/week @ 2024-07-05 10/week @ 2024-07-12

2,679 每月下载量
3 crates 中使用

MIT/Apache

60KB
1K SLoC

pi_arr

Crate Github Docs

多线程安全数组结构,自动扩展数组。所有操作都是无锁的。

示例

设置数组中的一个元素并检索它

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

数组可以使用 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));
    }
}

元素可以通过细粒度锁进行修改

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

依赖项

~170KB