我正在用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中的多线程功能,以及有关如何解决此问题的任何提示?