boxcar
一个支持并发的、仅追加的向量。
本 crate 提供的向量支持并发的 get
和 push
操作。所有操作都是无锁的。
示例
向向量追加一个元素并检索它:
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());
// 创建 6 个向向量追加元素的线程
let threads = (0..6)
.map(|i| {
let vec = vec.clone();
std::thread::spawn(move || {
vec.push(i); // 通过 `&Vec` 推入元素
})
})
.collect::<Vec<_>>();
// 等待线程完成
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());
// 插入一个元素
vec.push(Mutex::new(1));
let thread = std::thread::spawn({
let vec = vec.clone();
move || {
// 通过互斥锁修改
*vec[0].lock().unwrap() += 1;
}
});
thread.join().unwrap();
let x = vec[0].lock().unwrap();
assert_eq!(*x, 2);
}