You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在另一个线程构造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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 18:12:21