相互交织的范围如何造成“数据竞争”? [复制]

2023-12-08

The 锈书讨论了拥有多个读取器和对一个对象的多个可变引用作为可能导致问题的数据竞争情况。

例如,这段代码:

fn main() {
    let mut x = 1;
    let r1 = &mut x;
    *r1 = 2;
    let r2 = &mut x;
    *r2 = 3;
    println!("{}", r1);
    println!("{}", r2);
}

将被 Rust 编译器拒绝,因为r1 and r2范围是相互交织的。

但这里有什么问题呢?我的意思是,这只是一个线程,并且没有“同时读写”,因此所有这些语句都应该严格按顺序执行,并给出确定性的可重现结果。


From 尼科·马萨基斯的博客:

我经常认为,虽然技术意义上的数据争用只能发生在并行系统中,但问题feel就像顺序系统中不断出现的数据竞争一样。一个例子是 C++ 民间所说的迭代器失效—基本上,如果您迭代哈希表并尝试在迭代期间修改哈希表,则会得到未定义的行为。有时您的迭代会跳过键或值,有时会显示新键,有时不会,等等。

但无论结果如何,迭代器失效感觉与数据竞争非常相似。这个问题经常出现,因为你有一段代码迭代哈希表,然后调用在其他模块中定义的子例程。然后,另一个模块写入同一个哈希表。这两个模块本身看起来都很好,只有两者的组合才会导致问题。由于结果的不确定性,代码经常会在很长一段时间内正常工作,直到出现问题为止。

Rust 的类型系统可以防止迭代器失效。

Rust 的类型系统不允许像下面这样的单线程程序进行编译,因为它们会导致未定义的行为,而从技术上讲,这不是一场数据竞赛这个特殊的错误与“由两段独立的代码以交织的方式改变相同数据引起的错误”属于同一范围,因此它与数据竞争非常相似,我相信这就是 Rust 书试图传达的内容:

use std::collections::HashMap;

fn main() {
    let mut map = HashMap::new();
    map.insert(1, 1);
    map.insert(2, 2);
    map.insert(3, 3);
    
    for _ in map.iter() {
        map.insert(4, 4); // compile error!
    }
}

操场

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

相互交织的范围如何造成“数据竞争”? [复制] 的相关文章

随机推荐

  • 加载多个图像时回调的跨浏览器解决方案?

    我检查了其他问题 但它们都包含如何在加载一张特定图像时进行回调的信息 var img new Image img src images img png if img complete img onload function code to
  • 在android 3.0(蜂窝)中隐藏系统栏

    如何在android 3 0 honeycomb 中隐藏系统栏 无法删除系统栏 在未 root 的设备上 您可以进入 熄灯模式 该模式会将其变暗并仅显示按钮使用以下代码的点 ref View v findViewById R id view
  • 如何在 SQL 语句中组合 AND 和 OR

    我有这样的SQL语句 SELECT FROM table WHERE type 3 OR type 5 OR type 4 and table deleted 1 我读过可以使用括号来完成此操作 但我想知道这是否有效 SELECT FROM
  • 从不区分大小写的数组中删除重复值的最佳解决方案[重复]

    这个问题在这里已经有答案了 我找到了一些解决方案 但我无法决定使用哪一个 使用 php 的最紧凑 最有效的解决方案是什么array unique 函数在不区分大小写的数组上 Example input array green Green b
  • 如何在 Meteor 中存储日期和时间以进行范围查询?

    我的应用程序需要创建在浏览器中的 3 个不同时区中显示 startDate 的对象 日期还必须包括确切的时间 日期的存储方式应允许查询 提供 X 和 Y 之间的所有日期 并将其解析为 3 个时区 我的问题是我应该如何最好地保存 并随后检索
  • 修复 GCC 的 #includes <> (Code::Blocks)

    我正在使用一些为不同编译器 链接器编写的代码 它包括如下文件 include
  • 将图像从加载项导入图像管理器

    我们通过插件在 EA 中自动创建需求元素 但问题是我们无法将图像从目录导入到图像管理器并将超链接添加到需求元素注释 那么 企业架构师是否提供了任何API来将图像从目录导入到图像管理器并将超链接添加到需求元素注释中 EA 将图像存储在t im
  • Android 按钮有两个功能

    我需要一个具有两个功能的按钮 如果我点击它一次 它就会转到下一页 如果我按住该按钮 它将允许我编辑按钮上的文本 点击该按钮后可以转到下一页 但是如何实现第二个功能 该功能允许我在按住按钮时更改文本 有人知道吗 java代码 public c
  • Google Datastore 跨区域复制

    我们有一个在美国和欧盟托管的应用程序 为了获得出色的性能 我们将在两个位置托管一个数据存储实例 现在我们的问题是如何将数据从美国数据存储复制到欧盟数据存储 或者从技术角度来看 我们将数据存储在哪里并不重要 目前还没有多位置 GAE 应用程序
  • 如何在子视图中使用addChildViewController

    我想用addChildViewController in View 子视图数组的一个视图 但我不知道这一点 这是我的代码 for UIView subview in self view subviews if subview tag 1 C
  • 是什么原因导致此错误“无法写入应用程序 file.ini”

    我的应用程序是用delphi构建的 它可以在除Windows 7 64位机器之外的其他平台上完美运行 每次尝试关闭应用程序都会给我这个错误 无法写入应用程序文件 ini 这是我的关闭代码 procedure TfrmMain FormClo
  • SwiftUI - 在视图中显示从 Firebase 获取的数据?

    Firebase 我试图在 SwiftUI 视图中显示从 Firestore 获取的数据 但遇到问题 我从 Firebase 提取数据没有问题 但我无法按照我想要的方式显示数据 我使用 MVVM 架构 我的模型是这样的 struct Use
  • SwiftUI - 列表编辑模式 - 如何更改删除按钮标题?

    有没有办法在编辑列表时更改删除按钮标题 例子 struct ContentView View State private var users Paul Taylor Adele var body some View NavigationVi
  • 使用 Youtube API 获取用户电子邮件

    如何使用 Youtube API 获取经过身份验证的用户电子邮件 我尝试使用channels list GET https www googleapis com youtube v3 channels part brandingSettin
  • 如何在 pygame 中将旋转限制为设定的度数?

    我的问题与下面问题的答案相关 旋转一个矩形 如何将旋转限制在图中红色标记的区域 我尝试了各种方法但没有成功 代码始终将指针保留在其他区域 我修改后的代码如下 import pygame math base64 pygame init scr
  • 使用 htaccess 删除单个查询参数

    由于不值得在这里讨论的原因 Google 一直在为我的一个网站建立索引 其中 URL 中包含不必要的查询字符串 我想将我的 htaccess 文件修改为 301 将所有这些请求重定向到 URL 而无需查询字符串中不需要的部分 但保留查询字符
  • Bootstrap 表单:如何动态创建单选按钮的唯一名称

    这个问题是这个问题的后续问题one This JSfiddle体现了我想要实现的目标 Final Solution由 Scaramouche 提供 下面的函数动态地建立一个 列表 其中单选按钮每组四个 每个组都应该有一个唯一的名称 这使得可
  • 在哪里存储将在我的应用程序中使用的常量对象

    可以说我有一个item 其中有字段 属性 Location 平均值 可用性 我有10 15个items 我想要预定义其值 或者将其写入某处 然后加载到要使用的代码中 哪一个是最佳实践 这些将是常量 只是启动参数 在应用程序生命周期中不会被修
  • C结构的大小

    struct st1 int a 1 int b 3 int c 6 int d 3 s1 struct st2 char a 3 s2 int main printf d d sizeof s1 sizeof s2 getchar 我得到
  • 相互交织的范围如何造成“数据竞争”? [复制]

    这个问题在这里已经有答案了 The 锈书讨论了拥有多个读取器和对一个对象的多个可变引用作为可能导致问题的数据竞争情况 例如 这段代码 fn main let mut x 1 let r1 mut x r1 2 let r2 mut x r2