我正在编写一个有两个线程的应用程序:一个 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]>
宽度为两个指针,并且标准库不提供跨平台原子。这确实是最简单的方法。
Sized
表示在编译时已知大小的类型。数组无论多大,在编译时始终已知其大小。切片则不然。