所以我当前的用例是:
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
我的理解是:
材料是指向各种Material实现的盒装指针的堆分配向量。
然后用Arc类型包装,该类型是原子引用计数的只读指针。
我应该能够与线程安全地共享此指针吗?
material :: Material无法安全共享,但为什么不使用Arc指针呢?
答案 0 :(得分:1)
如果您的物质特征定义如下:
trait Material{
...
}
然后,将其定义为:
trait Material: Send + Sync{
...
}
这里trait Material: Send + Sync
意味着每种实现Material的类型也必须实现Send and Sync
material :: Material无法安全共享,但为什么不使用Arc指针呢?
您必须让编译器知道Box恰好容纳具有恰好满足Send
和Sync
的特征的东西
您可以将materials
的声明更改为(与上述相同的原因):
let mut materials: Vec<Box<Material + Send + Sync>> = Vec::new();