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);
}
相关推荐
Hello_Embed1 天前
STM32HAL 快速入门(十九):UART 编程(二)—— 中断方式实现收发及局限分析
笔记·stm32·单片机·嵌入式硬件·学习
天上的光1 天前
关于学习的一些感悟
学习
red_redemption1 天前
自由学习记录(95)
学习
东风西巷1 天前
Balabolka:免费高效的文字转语音软件
前端·人工智能·学习·语音识别·软件需求
XISHI_TIANLAN1 天前
【多模态学习】Q&A3:FFN的作用?Embedding生成方法的BERT和Word2Vec?非线性引入的作用?
学习·bert·embedding
KFCcrazy41 天前
嵌入式学习日记(39)51单片机
嵌入式硬件·学习·51单片机
MuMuMu#1 天前
JAVA NIO学习笔记基础强化学习总结
java·学习·nio
lingggggaaaa1 天前
小迪安全v2023学习笔记(七十九讲)—— 中间件安全&IIS&Apache&Tomcat&Nginx&CVE
笔记·学习·安全·web安全·网络安全·中间件·apache
我登哥MVP1 天前
Java File 类学习笔记
java·笔记·学习
mysla1 天前
嵌入式学习day44-硬件—ARM体系架构
学习