我正在编写一个具有两个线程的应用程序:UI 线程和计算线程。我希望它们共享 T 类型的缓冲区向量。由于它是 90% 的读取,我选择使用 ArcSwap 进行同步。我想要实现的内存布局是这样的:
我想使用像
ArcSwap<Arc<[T]>>
这样的类型,但 Rust 编译器抱怨 [T]
没有实现 Sized
。这对我来说很有意义(因为它是一个切片),但为什么它是一个编译错误?
我查看了 ArcSwap 实现,似乎原子指针需要指向 Sized 类型,但为什么呢? (我复制了下面的定义)
pub struct ArcSwapAny<T: RefCnt, S: LockStorage = Global> {
// Notes: AtomicPtr needs Sized
/// The actual pointer, extracted from the Arc.
ptr: AtomicPtr<T::Base>,
/// We are basically an Arc in disguise. Inherit parameters from Arc by pretending to contain
/// it.
_phantom_arc: PhantomData<T>,
lock_storage: S,
}
内存布局的实现方式是
ArcSwap<Arc<Box<[T]>>>
吗?这看起来非常笨重(而且我担心三重间接)。另外,为什么ArcSwap[T; 100]
似乎有效?就记忆而言,Sized 类型意味着什么?
要使
ArcSwap<T>
工作,它必须能够原子地交换 T
。可以原子地交换指针,但是 Arc<[T]>
是两个指针宽,并且标准库不为此提供跨平台原子。
内存布局的实现方式是
吗?ArcSwap<Arc<Box<[T]>>>
这确实是最简单的方法。
Sized 类型对于内存来说意味着什么?
Sized
表示在编译时大小已知的类型。数组无论多大,其大小始终在编译时已知。一片没有。