6个版本

0.2.5 2024年5月1日
0.2.4 2023年11月1日
0.2.3 2023年9月9日
0.2.2 2023年7月29日
0.1.0 2022年3月13日

#101并发

Download history 476/week @ 2024-05-03 552/week @ 2024-05-10 573/week @ 2024-05-17 385/week @ 2024-05-24 353/week @ 2024-05-31 362/week @ 2024-06-07 374/week @ 2024-06-14 382/week @ 2024-06-21 302/week @ 2024-06-28 305/week @ 2024-07-05 507/week @ 2024-07-12 516/week @ 2024-07-19 551/week @ 2024-07-26 643/week @ 2024-08-02 1716/week @ 2024-08-09 1993/week @ 2024-08-16

4,978 每月下载量
用于 28 Crate(11 个直接使用)

MIT 许可证

30KB
549

boxcar

Crate Github Docs

并发、只添加的向量。

该crate提供的向量支持并发 getpush 操作。所有操作都是无锁的。

示例

向向量添加元素并检索它

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

向量可以使用 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));
    }
}

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

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

无运行时依赖