如何构造 Rust 对象的类型以在线程之间共享

问题描述 投票:0回答:1

我正在编写一个具有两个线程的应用程序:UI 线程和计算线程。我希望它们共享 T 类型的缓冲区向量。由于它是 90% 的读取,我选择使用 ArcSwap 进行同步。我想要实现的内存布局是这样的:

stack and heap

我想使用像

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 类型意味着什么?

rust types heap-memory
1个回答
0
投票

要使

ArcSwap<T>
工作,它必须能够原子地交换
T
。可以原子地交换指针,但是
Arc<[T]>
是两个指针宽,并且标准库不为此提供跨平台原子。

内存布局的实现方式是

ArcSwap<Arc<Box<[T]>>>
吗?

这确实是最简单的方法。

Sized 类型对于内存来说意味着什么?

Sized
表示在编译时大小已知的类型。数组无论多大,其大小始终在编译时已知。一片没有。

© www.soinside.com 2019 - 2024. All rights reserved.