我正在尝试创建一个包含多个字节块的结构,其中每个字节块都保存在一个单独的RwLock
.
这适用于性能非常重要的体素引擎。每个字节块都需要由多个线程读取/写入。需要多个RwLocks
,这样只有一个特定的块将被锁定,其余的块可以自由地被其他线程读取/写入;锁定整个结构将导致锁定所有正在执行工作的线程。
大多数其他结构将被分配一个特定的插槽,字节块需要堆栈分配。
编译器抱怨它不能复制RwLock
s 因为没有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
大小在编译时无法知道,那么指向每个字节块的指针向量是否有效?如果是这样,我该如何安全地实施呢?