这个问题在这里已有答案:
所以我目前的用例是我需要:
Vec<Box<Material>>
,其中Material是一个特征。我目前的方法是使用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
我对它的理解是:
材料::材料无法安全共享,但为什么不指向它的Arc指针?
如果您的材料特征定义如下:
trait Material{
...
}
然后,将其定义为:
trait Material: Send + Sync{
...
}
这里trait Material: Send + Sync
意味着实现Material的每个类型都必须实现Send和Sync
材料::材料无法安全共享,但为什么不指向它的Arc指针?
你必须让编译器知道Box碰巧持有的东西恰好满足Send
和Sync
您可以将materials
的声明更改为(出于与上述相同的原因):
let mut materials: Vec<Box<Material + Send + Sync>> = Vec::new();