2

我正在尝试创建一个包含多个字节块的结构,其中每个字节块都保存在一个单独的RwLock.

这适用于性能非常重要的体素引擎。每个字节块都需要由多个线程读取/写入。需要多个RwLocks,这样只有一个特定的块将被锁定,其余的块可以自由地被其他线程读取/写入;锁定整个结构将导致锁定所有正在执行工作的线程。

大多数其他结构将被分配一个特定的插槽,字节块需要堆栈分配。

编译器抱怨它不能复制RwLocks 因为没有Copy特征 on RwLock,我不想复制但 instance multiple RwLocks

mod constants {
    pub const CHUNK_BASE_SIZE: usize = 7;
    pub const CHUNK_ALLOC_COUNT: usize = 11;
}

mod example {
    use std::sync::RwLock;
    use super::constants;

    // =====================================================================
    struct BU8 {
        bytes: [[u8; constants::CHUNK_BASE_SIZE]; constants::CHUNK_BASE_SIZE],
    }

    impl BU8 {
        pub fn new() -> BU8 {
            BU8 {
                bytes: [[0; constants::CHUNK_BASE_SIZE]; constants::CHUNK_BASE_SIZE],
            }
        }
    }

    // =====================================================================
    pub struct Bytes {
        block: RwLock<BU8>,
    }

    impl Bytes {
        pub fn new() -> Bytes {
            Bytes {
                block: RwLock::new(BU8::new()),
            }
        }

        pub fn read(&self, y: usize, xz: usize) -> u8 {
            self.block.read().unwrap().bytes[y][xz]
        }

        pub fn write(&mut self, y: usize, xz: usize, value: u8) {
            self.block.write().unwrap().bytes[y][xz] = value;
        }
    }

    // =====================================================================
    pub struct Stacks {
        slots: [Bytes; constants::CHUNK_ALLOC_COUNT],
    }

    impl Stacks {
        pub fn new() -> Stacks {
            Stacks {
                // Cannot Copy, I dont want a Copy I want to instance a fixed sized array of RwLocks<BU8> blocks
                slots: [Bytes::new(); constants::CHUNK_ALLOC_COUNT],
            }
        }
    }
}

fn main() {}
error[E0277]: the trait bound `example::Bytes: std::marker::Copy` is not satisfied
  --> src/main.rs:53:24
   |
53 |                 slots: [Bytes::new(); constants::CHUNK_ALLOC_COUNT],
   |                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::marker::Copy` is not implemented for `example::Bytes`
   |
   = note: the `Copy` trait is required because the repeated element will be copied

主线程产生一个子线程,它将保存所有游戏/核心数据,并且可以通过子线程将产生的每个工作线程访问。

Block每个工作线程都将被分配工作负载以在 上分配的数据上读取/写入数据Stacks,但我不知道如何在RwLocks不使用集合的情况下以这种方式或任何其他方式实例化多个。

我尝试#[derive(Copy, Clone)]为每个结构添加,但Bytes结构错误是:

error[E0204]: the trait `Copy` may not be implemented for this type
  --> src/main.rs:24:18
   |
24 |         #[derive(Copy, Clone)]
   |                  ^^^^
25 |         pub struct Bytes {
26 |             block: RwLock<BU8>,
   |             ------------------ this field does not implement `Copy`

我猜RwLock大小在编译时无法知道,那么指向每个字节块的指针向量是否有效?如果是这样,我该如何安全地实施呢?

4

0 回答 0