所以我现在的用例是我需要:
Vec<Box<Material>>,其中材料是一个特点。我目前的方法是为Vec<..>使用一个弧形指针,然后对每个线程克隆它。
例如:
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
我对此的理解是:
材料:材料不能安全共享,但为什么不使用弧形指针呢?
发布于 2019-03-30 22:05:05
如果你的物质特征被定义为:
trait Material{
...
}然后,将其定义为:
trait Material: Send + Sync{
...
}在这里,trait Material: Send + Sync意味着实现材料的每一种类型都必须实现发送和同步。
材料:材料不能安全共享,但为什么不使用弧形指针呢?
您必须让编译器知道Box碰巧持有某种特性,而这种特性恰好实现了Send和Sync
或
您只需将materials的声明更改为(原因与上面相同):
let mut materials: Vec<Box<Material + Send + Sync>> = Vec::new();https://stackoverflow.com/questions/55435456
复制相似问题