1 个不稳定版本
0.1.1 | 2024年4月4日 |
---|---|
0.1.0 |
|
#1857 在 Rust 模式
7KB
91 行
这是一个简单的工具,帮助在线程间共享切片。
切片适配器
此库提供了一个 SliceAdapter
结构体,可用于在多个线程之间共享切片的引用。
切片适配器
SliceAdapter
存储切片的指针和长度。它实现了 Send
以允许在多个线程之间传递。
#[derive(Clone, Copy)]
pub struct SliceAdapter {
pointer: usize,
length: usize
}
unsafe impl Send for SliceAdapter {}
SliceAdapter
可以使用 From
特征从可变和不可变切片引用构建。
impl<T> From<&mut [T]> for SliceAdapter {
//...
}
impl<T> From<&[T]> for SliceAdapter {
//...
}
并且可以使用 From
转换回。
impl<T> From<SliceAdapter> for &mut [T] {
//...
}
impl<T> From<SliceAdapter> for &[T] {
//...
}
示例
测试演示了使用 SliceAdapter
在多个线程间共享可变切片引用。
在这个例子中,三个线程各自修改切片的不同元素
#[test]
fn test_adapter_for_mut_1() {
let mut a = [1, 2, 3, 4, 5];
let adapter = Arc::new(Mutex::new(SliceAdapter::from(&mut a[..])));
let adapter2 = adapter.clone();
let adapter3 = adapter.clone();
let handle1 = std::thread::spawn(move || {
let adapter: SliceAdapter = *(adapter2.lock().unwrap());
let slice: &mut [i32] = adapter.into();
slice[0] = 10;
});
let handle2 = std::thread::spawn(move || {
let adapter: SliceAdapter = *(adapter3.lock().unwrap());
let slice: &mut [i32] = adapter.into();
slice[1] = 20;
});
{
let adapter: SliceAdapter = *(adapter.lock().unwrap());
let slice: &mut [i32] = adapter.into();
slice[2] = 30;
}
handle1.join().unwrap();
handle2.join().unwrap();
assert_eq!(a, [10, 20, 30, 4, 5]);
}
#[test]
fn test_adapter_for_mut_2() {
let mut a = [1, 2, 3, 4, 5];
let adapter1 = SliceAdapter::from(&mut a[..1]);
let adapter2 = SliceAdapter::from(&mut a[1..2]);
let handle1 = std::thread::spawn(move || {
let slice: &mut [i32] = adapter1.into();
slice[0] = 10;
});
let handle2 = std::thread::spawn(move || {
let slice: &mut [i32] = adapter2.into();
slice[0] = 20;
});
{
a[2] = 30;
}
handle1.join().unwrap();
handle2.join().unwrap();
assert_eq!(a, [10, 20, 30, 4, 5]);
}