与线程共享不可变的引用

时间:2018-11-16 17:20:11

标签: multithreading rust threadpool

我正在用Rust编写一个渲染器,试图使它成为多线程的。我有一个Renderer结构,该结构在其构造函数中引用了一个Camera(特征)和一个Scene(结构)。

pub struct Renderer<'a> {
    camera: &'a Camera,
    scene: &'a Scene,
    // other...
}

场景包含Vec<Box<Intersectable>>,其中Intersectable是另一个特征。 Intersectable实现可能还包含不同的Boxed特性。

稍后,我使用线程池(thread_pool板条箱),尝试在我的线程函数中使用摄像机和场景引用:

let thread_pool = ThreadPool::new(self.thread_count as usize);
for descriptor in chunk_descriptors.iter() {
    thread_pool.execute(move|| {
        let image_chunk = self.render_image_chunk(self.camera, self.scene);
        tx_t.send(()).unwrap(); // Will send back chunk later...
    });
}

render_image_chunk定义为:

fn render_image_chunk(&self, camera: &'a Camera, scene: &'a Scene) -> ImageChunk { //... }

编译时,我得到:

  

错误[E0277]:(dyn renderer::object::Intersectable + 'static)无法   在线程之间安全共享-> src / renderer / renderer.rs:52:25   | 52 | thread_pool.execute(move || {|
  ^^^^^^^ (dyn renderer::object::Intersectable + 'static)不能是   在线程之间安全共享

我对为什么不能安全共享这些感到困惑。它们应该是不可变的引用,线程只需要从它们中读取,就不会对其进行突变。我也尝试将所有内容都包装在Arcs中,但是遇到了类似的错误。我从根本上缺少Rust中的多线程功能,以及有关如何解决此问题的任何提示?

0 个答案:

没有答案