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);
}
相关推荐
好奇龙猫4 小时前
日语学习-日语知识点小记-构建基础-JLPT-N3阶段-二阶段(19):阶段练习
学习
松涛和鸣5 小时前
11.C 语言学习:递归、宏定义、预处理、汉诺塔、Fibonacci 等
linux·c语言·开发语言·学习·算法·排序算法
Q***f6359 小时前
后端消息队列学习资源,RabbitMQ+Kafka
学习·kafka·rabbitmq
循环过三天10 小时前
7.7、Python-常用内置函数
笔记·python·学习
烤麻辣烫10 小时前
23种设计模式(新手)-5里氏替换原则
java·学习·设计模式·intellij-idea·里氏替换原则
AA陈超12 小时前
ASC学习笔记0007:用于与GameplayAbilities系统交互的核心ActorComponent
c++·笔记·学习·ue5·虚幻引擎
老蒋新思维14 小时前
紧跟郑滢轩,以 “学习力 +” 驱动 AI 与 IP 商业变革
网络·人工智能·学习·tcp/ip·企业管理·创始人ip·创客匠人
做cv的小昊15 小时前
科研论文PPT绘图技巧:绘制任意曲线三角形(胖三角形)并制作效果对比图
经验分享·笔记·学习·微软·ai绘画·数据可视化
小呀小萝卜儿15 小时前
2025-11-14 学习记录--Python-使用sklearn+检测 .csv 文件的编码+读取 .csv 文件
python·学习