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);
}
相关推荐
山荷枝3 小时前
Java学习第十天
java·学习
huibin1478523693 小时前
热缓解学习记录
android·学习
Nan_Shu_6144 小时前
学习:GSAP
学习
我命由我123456 小时前
匈牙利命名法
java·服务器·后端·学习·java-ee·kotlin·学习方法
xiaoxiangsiyan7 小时前
运维之前端反调试学习
运维·前端·学习·状态模式
思维新观察7 小时前
开学季数码怎么选?兼顾学习护眼与电竞娱乐有参考
学习·娱乐
菩提树下的打坐8 小时前
测试与安全测试融合:DAST / SAST / IAST 三选
学习
达柳斯·绍达华·宁8 小时前
重读CV系列——&&4、Mask-RCNN学习
学习
fīɡЙtīиɡ ℡10 小时前
深入学习JAVA并发编程(上)
java·开发语言·学习
PC2005-cloud10 小时前
KubeSphere学习笔记:部署nginx
笔记·学习·nginx