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 并发
2,679 每月下载量
在 3 crates 中使用
60KB
1K SLoC
pi_arr
多线程安全数组结构,自动扩展数组。所有操作都是无锁的。
示例
设置数组中的一个元素并检索它
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