如何在另一个线程构造Rc数据结构克隆并避免二次深拷贝
问题:避免跨线程深拷贝Rc结构时的二次复制
数据结构
use std::{thread, rc::Rc}; #[derive(Clone)] struct HugeAmoutOfData {} // 假设这是一个体积很大的结构 struct Node { foo: Vec<Rc<Node>>, bar: HugeAmoutOfData, }
背景
出于经合理测试后的性能考量,我不想使用Arc——这类数据会被频繁移动,Arc的原子操作开销不可接受。
现在需要在第二个线程中创建Node结构的深克隆,但Rc未实现Send trait,无法直接跨线程传递。我目前采用的方案需要两次深拷贝,非常繁琐:
当前实现方案
struct BoxedNode { foo: Vec<Box<BoxedNode>>, bar: HugeAmoutOfData, } impl From<&Rc<Node>> for Box<BoxedNode> { /* ... */ } impl From<&Box<BoxedNode>> for Rc<Node> { /* ... */ } fn main() { let foo = Rc::new(Node { foo: Default::default(), bar: HugeAmoutOfData{}}); let foo_box = Box::<BoxedNode>::from(&foo); // 第一次深拷贝 thread::spawn(move || { let _foo_copy = Rc::<Node>::from(&foo_box); // 第二次深拷贝 }).join().unwrap(); let _bar = foo; // 继续在主线程使用foo }
由于无法在Box<T>与Rc<T>之间转换以复用内存分配,我该如何避免第二次深拷贝?需要明确的是,我的目标是得到_foo_copy(即Rc<Node>实例),所有中间步骤包括Box相关的实现都可以修改。另外,Node结构本质上是非循环的(但不是树结构),如果这一点能简化问题也可以利用。
内容的提问来源于stack exchange,提问作者ChrisB
相关产品推荐
相关产品推荐

