如何在线程之间共享盒装特征类型的堆分配向量

时间:2019-03-30 20:37:27

标签: multithreading rust

所以我当前的用例是:

  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. 材料是指向各种Material实现的盒装指针的堆分配向量。

  2. 然后用Arc类型包装,该类型是原子引用计数的只读指针。

  3. 我应该能够与线程安全地共享此指针吗?

material :: Material无法安全共享,但为什么不使用Arc指针呢?

1 个答案:

答案 0 :(得分:1)

如果您的物质特征定义如下:

trait Material{
...
}

然后,将其定义为:

trait Material: Send + Sync{
...
}

这里trait Material: Send + Sync意味着每种实现Material的类型也必须实现Send and Sync

  

material :: Material无法安全共享,但为什么不使用Arc指针呢?

您必须让编译器知道Box恰好容纳具有恰好满足SendSync的特征的东西

OR

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

let mut materials: Vec<Box<Material + Send + Sync>> = Vec::new();