当一个值的所有者可以读取它而另一个线程更改它时,Rust 如何防止数据竞争?

2024-03-28

Rust 书中指出了以下内容参考文献和借用 https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html#mutable-references

当我们有一个不可变的引用时,我们也不能有一个可变的引用。不可变引用的用户不会期望值会突然从它们下面改变!然而,多个不可变引用是可以的,因为仅仅读取数据的人没有能力影响其他人对数据的读取。

但是所有者可以读取数据,而另一个线程通过可变借用更改值,对吧?难道我们不会再次遇到通常的问题吗?或者我在哪里误解了基本概念?


所有者可以读取数据,而另一个线程通过可变借用更改值,对吧?

这是不正确的,甚至是否涉及多个线程都没有关系。

您可以在下面的示例中亲自查看()。这是一个字符串值x被修改,同时保留对相同值的引用y:

let mut x = "123".to_string();
let y = &mut x;

x.push_str("456");

println!("y = {}", y);

这无法编译:

error[E0499]: cannot borrow `x` as mutable more than once at a time
 --> src/main.rs:5:5
  |
3 |     let y = &mut x;
  |             ------ first mutable borrow occurs here
4 |     
5 |     x.push_str("456");
  |     ^ second mutable borrow occurs here
6 | 
7 |     println!("y = {}", y);
  |                        - first borrow later used here

当我们尝试打电话时push_str,一个方法接收&mut self,假设当场构建对该值的新的可变引用。自从x已经在该范围内借用了,这是非法的。

现在,您甚至可以考虑重新分配而不是调用期望的方法&mut self。尽管如此,机会还是很大的:

let mut x = "123".to_string();
let y = &mut x;

x = "321".to_string();

println!("y = {}", y);
error[E0506]: cannot assign to `x` because it is borrowed
 --> src/main.rs:5:5
  |
3 |     let y = &mut x;
  |             ------ borrow of `x` occurs here
4 |     
5 |     x = "321".to_string();
  |     ^ assignment to borrowed `x` occurs here
6 | 
7 |     println!("y = {}", y);
  |                        - borrow later used here

借用的值也不能重新分配。

总而言之,价值的所有者仍然受到无论哪种借贷的限制。如果该值是不可变地借用的,则所有者也可以具有不可变的访问权限,但该值永远不能被写给 or moved只要借款到位。 当该值被可变借用时,所有者无法对该值执行任何操作,直到该引用被删除。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当一个值的所有者可以读取它而另一个线程更改它时,Rust 如何防止数据竞争? 的相关文章

随机推荐

  • ssh -vT [电子邮件受保护] 的权限被拒绝(公钥)错误

    安装了 Git 并创建了与 Facebook 应用程序一起使用的 heroku 帐户 无法与github建立连接 使用windows Git命令提示符将文件克隆到本地windows 7 输出如下 ssh vT email protected
  • Windows 7 操作中心

    如果有人可以指导我修改 控制 Windows 7 操作中心所需的新 MS API 我将不胜感激 我需要做的是将备份通知消息集成到我的应用程序中 该应用程序是操作中心的备份应用程序 换句话说 我希望Windows在第三方软件完成备份操作后显示
  • 使用 jQuery 从 'a' 元素的 'href' 属性中剪切文件名的最佳方法是什么?

    例如我有简单的代码 ul class list li a href http www aaa com bbb ccc file01 pdf Download file 01 a li li a href http www bbb com c
  • 我可以删除弹出视图中的箭头吗?

    我被要求删除弹出视图的箭头 这是否违反了人机界面准则 在另一个弹出窗口中显示一个弹出窗口是否明智 如果不违反人机界面准则怎么办 对于斯威夫特 popoverMenuViewController permittedArrowDirection
  • 在 vscode 中将现有 Java 项目转换为 Maven

    我有一个没有任何东西的旧Java项目 我想使用maven 因为缺少一些依赖项并且我找不到库 有人可以告诉我如何将该项目转换为 MavenWITH VSCODE 以下是一些步骤 告诉 VS Code使用Maven https code vis
  • 如何获取最顶层活动的标识符?

    我有一个服务 当最顶层的 Activity 发生变化时 它的行为必须改变 假设 活动 A 处于活动状态 然后服务开始某种处理 当 Activity A 不再可见时 此处理必须停止 用户按下 后退 主页 或执行任何其他操作使 Activity
  • MySQL 记录 UPDATE 应该会失败,但实际上却没有。为什么?

    这是一个有趣的情况 我用 MySQL 开始一个事务 我的交易涉及3个相关查询 每个查询都必须成功 如果没有成功 则不应将任何查询写入数据库 现在 故意 对于第二个查询 这恰好是一个更新查询 我改变了 标识要更新为无效 不存在 PK 值的记录
  • 在散点图中将值绘制为符号的最简单方法?

    在回答我之前关于修复 4D 数据散点图像的色彩空间的问题时 Tom10 建议将值绘制为符号 以便仔细检查我的数据 一个好主意 我过去运行过一些类似的演示 但我一生都找不到我记得的演示非常简单 那么 将数值绘制为散点图中的符号 而不是 o 的
  • IPv6 地址的正则表达式

    我有一个 IPv6 地址的正则表达式 如下所示 IPV4ADDRESS t digit 1 3 3 digit 1 3 t x4 xdigit 1 4 xseq x4 x4 0 7 xpart xseq xseq xseq xseq IPV
  • Scala sbt:sbt 中的多个依赖项

    我是 Scala 的新用户 正在按照创建 scala sbt 项目的方式进行操作 https www youtube com watch v Ok7gYD1VbNw https www youtube com watch v Ok7gYD1
  • 如何在shell中剪切字符串的第一列(可变长度)

    如何在shell中剪切字符串的第一列 可变长度 字符串的前 23006 帮助 txt 我需要 23006 作为输出 很多方法 cut d f1
  • 为什么我的 WebClient 大多数时候会返回 404 错误,但并非总是如此?

    我想要获取有关我的程序中的 Microsoft 更新的信息 但是 服务器在大约 80 的情况下会返回 404 错误 我将有问题的代码归结为这个控制台应用程序 using System using System Net namespace W
  • 实施 Dijkstra 算法

    我的任务是 大学课程 实施某种形式的寻路 现在 在规范中 我可以实现强力 因为要搜索的节点数量有限制 开始 中间两个 结束 但我想重新使用此代码并来实现迪杰斯特拉算法 http en wikipedia org wiki Dijkstra
  • 如何防止android服务被杀死(带通知的服务)

    我正在开发一个需要不断显示通知的应用程序 我有一项服务可以每秒显示一次通知 当资源不足时 android 就会终止我的服务 我已经从 onStartCommand 给出了返回 START STICKY 因此 一段时间后 服务将重新启动 但与
  • 如何创建自定义元素扩展类的新实例

    我正在尝试以下示例谷歌开发者网站 https developers google com web fundamentals getting started primers customelements extendhtml我收到错误 Typ
  • 如何使用 Grunt 为 LESS 配置 sourceMap?

    我正在使用 grunt 0 4 2 和 grunt contrib less 0 9 0 我希望将我的 LESS 编译成 CSS 并支持源映射 我的 LESS 文件位于public less 主要的称为main less 的编译public
  • 无论如何,Bootstrap 导航栏都不会居中

    我一直在尝试使用 Bootstrap 将我的导航栏集中在导航栏的中心 这非常糟糕 我尝试过使用类似问题中的信息 例如this one https stackoverflow com questions 7165423 twitter boo
  • JS hasAttribute 带有数据属性值

    有没有一种原生方法 没有 jQuery 来检查 dom 元素是否具有具有所选值的属性 例如 assume doc has data mod do defined 这将是真的 document hasAttribute data mod 但这
  • Xamarin 表单 - 以流形式打开文件

    这可能是一个非常简单的问题 但当我们谈论流时我总是感到困惑 我正在尝试在 Xamarin Forms 项目的 Android 部分中打开一个文件 我有一个 Java IO File 我想将其转换为流 以便能够使用这个简单的函数将其发送到 A
  • 当一个值的所有者可以读取它而另一个线程更改它时,Rust 如何防止数据竞争?

    Rust 书中指出了以下内容参考文献和借用 https doc rust lang org book ch04 02 references and borrowing html mutable references 当我们有一个不可变的引用