rust学习(BorrowMut异常)

现象:

编译没有问题,运行时出现:

代码:

rust 复制代码
pub fn do_test() {
    let v = Arc::new(RefCell::new(100));
    let v1 = v.try_borrow_mut().unwrap();
    let v2 = v.try_borrow_mut().unwrap();
}

原因:

一个cell貌似不能同时被借用两次,注意!!,包含多线程。所以如果出现这类错,也要考虑是否有多线程的问题。

解决方案:

不要长期持有borrow_mut的句柄。如下例子就能正常执行:

rust 复制代码
struct MyData {
    val:u32
}

pub fn do_test_1()  {
    let v: Arc<RefCell<MyData>> = Arc::new(RefCell::new(MyData {val:123}));
    v.clone().try_borrow_mut().unwrap().val = 10; //直接赋值,不做句柄获取
    v.clone().try_borrow_mut().unwrap().val = 12;
    println!("result is {}",v.clone().try_borrow_mut().unwrap().val);
    
}

但是如果一直拿着borrow_mut的句柄,就会报错。接下来这个代码会运行报错:

rust 复制代码
pub fn do_test_2() {
    let v: Arc<RefCell<MyData>> = Arc::new(RefCell::new(MyData {val:123}));
    let temp1 = v.clone();
    let mut v1 = temp1.try_borrow_mut().unwrap(); //长期借用...
    v1.val = 111;

    let temp2 = v.clone();
    let mut v2 = temp2.try_borrow_mut().unwrap(); //这里再借用就会报错
    v2.val = 222;

    println!("result is {}",v.clone().try_borrow_mut().unwrap().val);
}
相关推荐
通信小呆呆13 天前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?
人工智能·学习·算法·机器学习·机器人
H__Rick13 天前
自动对焦学习-3
人工智能·学习·计算机视觉
Daisy Lee13 天前
量化学习-第1章-什么是量化金融
学习·金融·datawhale
Alsn8613 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
YM52e13 天前
买菜计算器小应用 - HarmonyOS ArkUI 开发实战-PC版本
学习·华为·harmonyos·鸿蒙·鸿蒙系统
小雨下雨的雨13 天前
HarmonyOS ArkUI训练营入门-组件掌握系列-Animation 动画效果实现-PC版本
学习·华为·harmonyos·鸿蒙
cqbzcsq13 天前
CellFlow虚拟细胞论文阅读
论文阅读·人工智能·笔记·学习·生物信息
YangYang9YangYan13 天前
2026初入职场学习数据分析的价值
学习·数据挖掘·数据分析
guslegend13 天前
理论学习:什么是 Coding Agent?
学习
自传.13 天前
尚硅谷 Vibe Coding|第三章(1) Claude Code深度使用与进阶技巧 学习笔记
笔记·学习·尚硅谷·vibecoding