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 在 并发
4,978 每月下载量
用于 28 个 Crate(11 个直接使用)
30KB
549 行
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());
// 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);
}