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);
}
相关推荐
虾球xz1 小时前
游戏引擎学习第149天
人工智能·学习·游戏引擎
奕天者2 小时前
C++学习笔记(十七)——类之封装
c++·笔记·学习
亭墨2 小时前
linux0.11内核源码修仙传第六章——中断初始化
linux·c语言·驱动开发·学习·面试
好多大米2 小时前
[资源分享]-web3/区块链/学习路线/资料/找工作方式/水龙头
学习·web3·区块链
李长渊哦3 小时前
学习文章:Spring Boot 中如何使用 `@Async` 实现异步处理
java·spring boot·学习
李长渊哦4 小时前
学习文章:Spring Boot 中 Redis 配置与序列化管理
spring boot·redis·学习
WZF-Sang5 小时前
Linux——基础IO【3万字大章】
linux·服务器·c++·学习·文件系统·软硬链接·动态库静态库
刘阿去9 小时前
tcc编译器教程6 进一步学习编译gmake源代码
c语言·学习
LuckyLay10 小时前
Golang学习笔记_49——解释器模式
笔记·学习·设计模式·golang·解释器模式
sauTCc10 小时前
DataWhale-三月学习任务-大语言模型初探(一、二、五章学习)
人工智能·学习·语言模型