如何跨线程共享盒装特征类型的堆分配向量[重复]

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

这个问题在这里已有答案:

所以我目前的用例是我需要:

  1. 创建一个Vec<Box<Material>>,其中Material是一个特征。
  2. 推动盒装结构,将材料压入此Vec。
  3. 将此vec的只读版本共享给多个线程。

我目前的方法是使用Vec <..>的Arc指针,然后为每个线程克隆它。

例如:

let mut materials: Vec<Box<Material>> = Vec::new();
// ... push stuff into materials
let materials = Arc::new(materials);
let mat_cloned = materials.clone();
// pool is a threadpool
pool.execute(move|| {
    // do read stuff with mat_cloned.
}

但是我得到了编译器错误:dyn 'materials::Material' cannot be shared between threads safely

我对它的理解是:

  1. Materials是一个堆分配的矢量,用于指向各种Material实现的盒装指针。
  2. 然后我用一个Arc类型进行换行,这是一个原子引用计数的只读指针。
  3. 我应该能够安全地与线程共享此指针吗?

材料::材料无法安全共享,但为什么不指向它的Arc指针?

multithreading rust
1个回答
1
投票

如果您的材料特征定义如下:

trait Material{
...
}

然后,将其定义为:

trait Material: Send + Sync{
...
}

这里trait Material: Send + Sync意味着实现Material的每个类型都必须实现Send和Sync

材料::材料无法安全共享,但为什么不指向它的Arc指针?

你必须让编译器知道Box碰巧持有的东西恰好满足SendSync

OR

您可以将materials的声明更改为(出于与上述相同的原因):

let mut materials: Vec<Box<Material + Send + Sync>> = Vec::new();
© www.soinside.com 2019 - 2024. All rights reserved.