rust学习(BorrowMut异常)

现象:

编译没有问题,运行时出现:

代码:

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的句柄。如下例子就能正常执行:

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的句柄,就会报错。接下来这个代码会运行报错:

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);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/626548.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++异常学习

C语言传统的处理错误的方式 传统的错误处理机制&#xff1a; 终止程序&#xff0c;如assert&#xff0c;缺陷&#xff1a;用户难以接受。如发生内存错误&#xff0c;除0错误时就会终止程序。返回错误码&#xff0c;缺陷&#xff1a;需要程序员自己去查找对应的错误。如系统的…

DC-8渗透测试复现

DC-8渗透测试复现 目的&#xff1a; 获取最高权限以及flag 过程&#xff1a; 信息打点--sql注入- 命令执行反弹shell-exim4提权 环境&#xff1a; 攻击机&#xff1a;kali(192.168.85.137) 靶机&#xff1a;DC_3(192.168.85.140) 复现&#xff1a; 一.信息收集 nmap -…

java泛型知多少

Java 泛型了解么&#xff1f; 泛型是一种在编译时提供类型安全检查的机制,可以增加我们代码的可读性和安全性。泛型可以在编译时期对泛型参数进行校验来指定选入对象的类型&#xff0c;比如 ArrayList<Person> persons new ArrayList<Person>() 这行代码就指明了…

包装类的认识

前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&#x1…

小程序实现前端热更新的基础技术原理

小程序技术是一种很有前景的移动开发技术&#xff0c;尤其在移动App开发中&#xff0c;高频业务场景的热更新方向上。 时间来到了2024年&#xff0c;小程序的技术已经作为企业构建超级App的一种快速迭代业务场景&#xff0c;或者便捷引入第三方生态的技术“利器”&#xff0c;…

每日两题1

文章目录 使用最小花费爬楼梯91解码方法 使用最小花费爬楼梯 class Solution { public:int minCostClimbingStairs(vector<int>& cost) {if(cost.size() 2)return min(cost[0],cost[1]);vector<int> dp;dp.reserve(cost.size()1);dp[0] 0;dp[1] 0;for(int i…

书生·浦语大模型全链路开源体系-第4课

书生浦语大模型全链路开源体系-第4课 书生浦语大模型全链路开源体系-第4课相关资源XTuner 微调 LLMXTuner 微调小助手认知环境安装前期准备启动微调模型格式转换模型合并微调结果验证 将认知助手上传至OpenXLab将认知助手应用部署到OpenXLab使用XTuner微调多模态LLM前期准备启动…

【MySQL数据库】 (篇一 ) 让你快速上手——新手速通版

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、如何起步&#xff1f;&#x1f3c3;‍1.创建数据库&#xff1a;2.选择数据库&#xff1a;3.删除数据库&#xff1a;4.创建表&#xff1a;5.删除表&#xff…

冒泡排序的时间复杂度的讲解

冒泡排序代码&#xff1a; 冒泡排序的时间复杂度&#xff1a; 最坏情况&#xff1a; 遍历了n-1&#xff0c;n-2&#xff0c;n-3......才让数字来到该处于的位置&#xff0c;而这是一个等差数列&#xff08;n-1&#xff0c;n-2&#xff0c;n-3......&#xff09;&#xff0c;该数…

四川教育装备行业协会考察团走访云轴科技ZStack共话技术创新应用

近日&#xff0c;四川省教育装备行业协会高等教育技术专业委员会组织了一次深入的考察活动&#xff0c;旨在加强与其他省市高校及企业之间的交流与合作&#xff0c;学习借鉴先进的教育装备与管理经验&#xff0c;以提升本省的高等教育技术水平。考察团一行先后走访了武汉理工大…

2024-6.python流程控制

流程控制 流程控制指的是代码运行逻辑、分支走向、循环控制&#xff0c;是真正体现程序执行顺序的操作。 程序是由语句构成&#xff0c;而流程控制语句 是用来控制程序中每条语句执行顺序的语句。可以通过控制语句实现更丰富的逻辑以及更强大的功能。几乎所有编程语言都有流程…

Nacos源码分析,Nacos gRPC服务端设计

作为SpringCloudAlibaba微服务架构实战派上下册和RocketMQ消息中间件实战派上下册的作者&#xff0c;我来给大家分析一下Nacos的源码。 Nacos支持采用gRPC作为通信渠道&#xff0c;并且针对Nacos集群之间的通信以及客户端和Nacos服务端之间的通信&#xff0c;同时启动了两个相…