#切片 #线程 #共享 #参考 #适配器 #可变 #共享

bin+lib slice_adapter

帮助在线程间共享切片的工具

1 个不稳定版本

0.1.1 2024年4月4日
0.1.0 2024年4月4日

#1857Rust 模式

MIT 许可证

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

无运行时依赖