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);
}
相关推荐
一弓虽7 分钟前
git 学习
git·学习
Moonnnn.2 小时前
【单片机期末】串行口循环缓冲区发送
笔记·单片机·嵌入式硬件·学习
viperrrrrrrrrr73 小时前
大数据学习(131)-Hive数据分析函数总结
大数据·hive·学习
fen_fen3 小时前
学习笔记(26):线性代数-张量的降维求和,简单示例
笔记·学习·算法
布伦鸽5 小时前
C# WPF 左右布局实现学习笔记(1)
笔记·学习·c#·wpf
陳麦冬6 小时前
深入理解指针(二)
c语言·学习
普宁彭于晏9 小时前
CSS3相关知识点
前端·css·笔记·学习·css3
fen_fen9 小时前
学习笔记(25):线性代数,矩阵-矩阵乘法原理
笔记·学习·线性代数
xiaoxiaoxiaolll11 小时前
从理论崩塌到新路径:捷克科学院APL Photonics论文重构涡旋光技术边界
学习
抠脚学代码12 小时前
Ubuntu18.6 学习QT问题记录以及虚拟机安装Ubuntu后的设置
qt·学习·ubuntu