首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何跨线程共享盒式特征类型的堆分配向量

如何跨线程共享盒式特征类型的堆分配向量
EN

Stack Overflow用户
提问于 2019-03-30 20:37:26
回答 1查看 112关注 0票数 1

所以我现在的用例是我需要:

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

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

例如:

代码语言:javascript
复制
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. 然后,我用一个弧形类型包装,这是一个原子引用,计数只读指针。
  3. 我应该能够安全地与线程共享这个指针吗?

材料:材料不能安全共享,但为什么不使用弧形指针呢?

EN

回答 1

Stack Overflow用户

发布于 2019-03-30 22:05:05

如果你的物质特征被定义为:

代码语言:javascript
复制
trait Material{
...
}

然后,将其定义为:

代码语言:javascript
复制
trait Material: Send + Sync{
...
}

在这里,trait Material: Send + Sync意味着实现材料的每一种类型都必须实现发送和同步。

材料:材料不能安全共享,但为什么不使用弧形指针呢?

您必须让编译器知道Box碰巧持有某种特性,而这种特性恰好实现了SendSync

您只需将materials的声明更改为(原因与上面相同):

代码语言:javascript
复制
let mut materials: Vec<Box<Material + Send + Sync>> = Vec::new();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55435456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档