在 C++ 中将值从 X 更改为 X 会导致数据争用吗?

2024-01-03

我有可处理具有不同布局的大数据块的代码。布局将决定哪些数据是固定的,哪些数据是不固定的。一旦数据被固定在一个块中,它通常就不会再改变。所以所有读取数据的代码总是会看到相同的数据。

但是,其他服务可以在这些块中进行更改,只要它们确定没有代码将读取该块的该部分。为了简化代码,包含更改的块将从一个服务发送到另一个服务,无论块的布局如何。然后,接收服务将覆盖整个块,包括未更改的数据。让我用一个例子来说明这一点:

假设我们有以下数据块:

57 23 98 17 25 00 00 00 00 00

想象一下前 5 个值是“固定的”。我们服务中的代码只会读取前 5 个值,而不会读取接下来的 5 个值。由于我们的架构设计,我们可以保证这一点。接下来的 5 个值实际上没有意义,因此我在表中添加了零来说明这一点。

现在另一个服务确定接下来的 5 个值,将完整的块发送到我们的服务,我们只需用新数据覆盖完整的块即可。由于前 5 个值是“固定的”,因此它们保持不变,但是传输和覆盖块的代码不知道块的布局,因此它唯一能做的就是覆盖整个块。这是结果:

57 23 98 17 25 08 33 42 71 85

如前所述,前 5 个值没有改变,尽管它们被传输逻辑覆盖。

问题是:这是一场数据竞赛吗?如果其他线程可以同时读取数据,是否允许用完全相同的值覆盖内存地址?


这是一场数据竞赛吗?

Yep.

如果其他线程可以同时读取数据,是否允许用完全相同的值覆盖内存地址?

没有明确 - 这也不是唯一的问题。

如果您的编译器实际上执行单个 8 字节加载,则您有一个real(即,甚至可能不仅仅是理论上的)最后 3 个字节上的数据竞争。假设您有一台假设的机器,其中uint64_t value 57 23 98 17 25 00 00 42是一个陷阱表示,您的更新线程使用memmove,并复制更新向后.

然而,数据竞争意味着行为是不确定的按标准。它可能在特定平台上定义良好 - 例如任何没有整数陷阱表示的平台,您知道编译器将真正使用字节加载的任何平台,或者具有幂等存储的显式语义的任何平台。

例如,参见[介绍种族] 注 23 https://timsong-cpp.github.io/cppwp/intro.races#note-23:

引入对潜在共享内存位置的推测性读取的转换可能不会保留本文档中定义的 C++ 程序的语义,因为它们可能会引入数据争用。然而,它们通常在优化编译器的上下文中有效,该优化编译器针对具有明确定义的数据竞争语义的特定机器。对于不容忍竞争或不提供硬件竞争检测的假设机器,它们将无效

(对于非投机竞赛没有这样的注释,对于幂等存储也没有特定的例外,但在 IMO 中采取相同的方法是合理的)。

显然,如果您可以编写代码,那么它doesn't依赖于这些平台细节,在面对编译器和/或平台更新时,它将更加可移植且不易脆弱。仅在块的两个版本之间进行原子交换(因此您从保证不变的副本中读取,并写入保证不共享的副本)将始终是正确的,并且由于减少了缓存/一致性流量,甚至可能会更快。

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

在 C++ 中将值从 X 更改为 X 会导致数据争用吗? 的相关文章

  • 动态选择和更新 LINQ 结果集中的列值

    我有一个场景 其中存在 LINQ 结果集 我使用了以下查询 var stockDetails from d in db BloodBanks where d bbUserName Session username ToString sele
  • 如何通知父线程所有子线程都已终止?

    我有一个控制台应用程序正在移植到 WPF 该应用程序有 3 个工作线程 在将一些输出结果打印到屏幕上之前 这些线程都连接到主线程 我的理解是 如果我尝试在 WPF 应用程序中执行相同的操作 GUI 将被阻止并且不会响应用户 那么如何通知父线
  • 在 C# 中轻松创建支持索引的属性

    在 C 中我发现索引属性 http msdn microsoft com en us library aa288464 VS 71 aspx非常有用 例如 var myObj new MyClass myObj 42 hello Conso
  • Mercurial/extdiff 没有更改为临时目录(正如我认为应该的那样)

    使用 Windows Mercurial 和 extdiff 扩展 适用于 Mercurial 我试图设置 extdiff 以使用 WinDiff 作为外部比较工具 但我认为我已经将问题范围缩小到足以说明问题在我还没有做到这一点之前 根据我
  • 可变数量的(常量)引用参数

    我试图从我的高级代码 使用 C 11 中消除原始指针 并且我找到了引用 尤其是const 在许多情况下 当没有所有权转移时 是一个很好的替代品 但如果有的话该怎么办variable我想通过 常量 引用传递的参数数量 你不能创建一个std v
  • 为什么这个 oracle 批量插入不起作用?

    我正在尝试将一些数据批量插入到 oracle 数据库中 我按照文档中的示例进行操作 this DataBaseAccess new OracleConnection connString var dataAdapter new Oracle
  • 将 void *user_data 转换为对象

    我该如何投射void something到标准 C 中的对象 具体来说我想投void userdata to std map
  • std::tr1::function 和 std::tr1::bind

    我在使用时遇到问题veryC 类中的复杂 C 函数 重写 C 函数是not一个选项 C函数 typedef void integrand unsigned ndim const double x void fdata unsigned fd
  • 通过用于 Symbol 条码扫描仪 DS4208 的 SNAPI.dll API 捕获图像

    我想通过 SNAPI API 从 Symbol 目前为 Zebra 条形码扫描仪 DS4208 型号 我们还使用 Zebra 的另一个但兼容的型号 捕获图像 条形码捕获 识别效果很好 但看起来像SnapiDLL SNAPI SnapShot
  • 我要恢复我的记忆!我怎样才能真正处理一个控件?

    我正在制作一个应用程序 它创建大量的窗口控件 按钮和标签等 它们都是通过函数动态生成的 我遇到的问题是 当我删除控件并处置它们时 它们不会从内存中删除 void loadALoadOfStuff while tabControlToClea
  • 从套接字读取 C HTTP

    我想知道如何判断是否已从套接字接收到所有数据 这是一个简单的网络代理 现在我正在处理请求部分 所以发送的内容应该以 r n r n 结尾 我不知道请求会持续多久 我在这里读过一些帖子 说我应该检查读取函数是否返回 0 但其他人说0只在客户端
  • ASP.NET中如何访问除wwwroot以外的位置

    我可以使用访问服务器的物理位置Server MapPath 这给了我内部的物理路径wwwroot文件夹 我想将一些数据保存到同一服务器的另一个驱动器中D 驾驶 我想我无法获取以下位置的物理位置D 驾驶使用Server MapPath因为它位
  • 三种 System.Drawing 方法表现出缓慢的绘制或闪烁:解决方案?或其他选择?

    我正在通过 System Drawing 进行一些绘图 但遇到了一些问题 我将数据保存在队列中 并将该数据绘制 绘制 到三个图片框中 此方法填充图片框 然后滚动图形 所以不要在以前的绘图上绘制 并且逐渐看起来更混乱 我找到了两种绘制图表的解
  • #define 内存地址声明

    这个 define 语句有什么作用 它用于定义内存地址 但我不明白 uint32 t 部分 define GPxDAT uint32 t 0x6FC0 通常用于访问映射到地址空间的硬件寄存器 或者一些特定的内存地址 硬件寄存器应定义为vol
  • C++ 联合数组和变量?

    在C 中没有办法做这样的事情吗 union Scalar x y Scalar v 2 Where x v 0 and y v 1 既然您使用的是 C 而不是 C 并且它们具有相同的类型 为什么不直接将 x 设为对 v 0 的引用 将 y
  • Control.FindForm 和 ContainerControl.ParentForm 有什么区别

    我想知道两者之间是否有任何功能 或其他 差异Control FindForm and ContainerControl ParentForm 我一直在使用 ParentForm创建我自己的用户控件时 但有什么原因吗 FindForm会是一个
  • 如何创建和使用类箭头运算符? [复制]

    这个问题在这里已经有答案了 因此 在到处研究之后 我似乎找不到如何创建类箭头运算符 即 class Someclass operator gt 我只需要知道如何使用它并正确使用它 它的输入是什么 它返回什么 我如何正确地声明 原型化它 运算
  • char[length]初始化并处理

    我定义了一个字符数组 char d 6 如果我在以下方面有误 请纠正我 此时没有为变量分配内存d 现在我要初始化它 d aaaaa 这种初始化之后 就不需要释放内存了 它将自动完成 我怎么知道是否char 被初始化了吗 我正在寻找类似的模式
  • 替换全局热键

    我有一个位于托盘中的应用程序 我想定义多个热键来触发我的程序中的事件 我从 AaronLS 在这个问题中的出色回答中找到了灵感 使用C 设置全局热键 https stackoverflow com a 27309185 3064934 如果
  • asp.net mvc GET 请求上的 formcollection 应该为空

    我正在发布一个简单的操作 public void Login FormCollection formCollection 即使查询字符串值很少 formcollection Count is 0 是靠行为吗 FormCollection 使

随机推荐

  • Heroku 陷入为 NodeJs 应用程序构建源代码的困境

    当我尝试在 heroku 上部署我的应用程序时 它陷入了远程 构建源 一开始以为是网络问题 换了网络 但是问题依旧 我也尝试过强制推送 也没用 Counting objects 100 19 19 done Delta compressio
  • Windows光标最大尺寸

    我有一个大小为 128x128 的光标 但是当我使用 LoadCursor 加载并显示它时 它只有 32x32 哪个API可以正确实现 MS 似乎调整了它的大小 谢谢 Windows XP 不包含任何大于 32x32 的系统光标 如果包含较
  • 更改 github 帐户 mac 命令行

    我有两个 github 帐户 一个用于工作 一个用于家庭 我正在处理一个个人项目 无法推送到 origin master 因为它说我仍然登录到我的工作帐户 我重置了我的全局用户 user name user email user token
  • React Admin - 如何使用 abc/def 等嵌套路径调用 dataProvider

    React admin 的Resource组件图name端点的 prop 值 例如 访问数据 http example com abc your Resource组件看起来像这样
  • Jasper 报告 HTML 组件

    我设计了一个简单的报告 将 HTML 调色板放入其中 iFrame 当我运行报告时 我收到此异常 java lang ClassNotFoundException net sf jasperreports components html H
  • 将 apache-spark 日志记录发送到 Amazon EMR 集群上的 redis/logstash 的最佳方法 [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 Amazon EMR 集群上触发提交作业 我希望将所有 Spark 日志记录发送到 redis logstash 在 EMR 下配置
  • Pandas 将用户代理列解析为多列

    我有一个 http 请求日志的数据框 唯一相关的列是我正在尝试解析的 userAgent 列 我正在使用 ua parser 这会将每个 userAgent 变成一个嵌套字典 如下所示 gt gt gt from ua parser imp
  • 如何在 MIPS 汇编中找到没有除法或模运算符的余数

    我想找到一种方法来知道一个整数是除以3还是7而不使用除法 因为它在MIPS汇编中非常慢 我做了很多研究但一无所获 有一种方法描述为格兰隆德和蒙哥马利 https gmplib org tege divcnst pldi94 pdf需要 奇
  • 如何将依赖子查询转换为联接以获得更好的性能?

    我有一个存储 主题 的数据库 每个主题都与一大堆图像相关联 这些主题的屏幕截图 现在我想显示最新的 10 个主题 对于每个主题 我只想从数据库中获取一张图像 ID 最低的图像 目前我的查询如下所示 我正在使用子查询 SELECT DISTI
  • ListPopupWindow 不遵守 WRAP_CONTENT 宽度规范

    我正在尝试使用 ListPopupWindow 通过ArrayAdapter 最终这将是一个更复杂的自定义适配器 代码如下 如截图所示 得到的结果ListPopupWindow看起来就像内容宽度为零一样 它显示了正确的项目数量 这些项目仍然
  • HighCharts - 将系列与值而不是百分比进行比较

    只需一个简单的答案 是否有一种简单的方法可以比较一系列值而不是百分比 像 比较 值 而不是 比较 百分比 之类的东西 或者我是否必须手动添加给定时间间隔的数据点 谢谢 是的 但该选项称为value 来自绘图选项 系列 比较 http api
  • 会话重放、会话固定、会话劫持

    谁能明确区分会话固定 会话重放和会话劫持攻击吗 我读了很多文章 但会话劫持和会话重放攻击之间的问题仍然不清楚 固定和劫持最终都有相同的目标 获得会话的访问权限 它们的区别仅在于实现这一目标的方式不同 会话劫持的行为很简单stealing现有
  • Jekyll:javascript 中的液体标签

    假设我有两个链接 所有帖子 和 个人 当用户单击 个人 链接时 他应该只能看到类别为 个人 的帖子 现在 液体标签是 for post in site posts 我想了解是否有办法访问该变量site posts来自 javascript
  • 构造函数内的 Try/catch 块

    在构造函数中使用 try catch 块是一种不好的编程习惯吗 或者只要我们的程序优雅地处理类型初始化器异常就没有什么区别 在 C 中 如果构造函数内有任何异常 框架总是会抛出 typeinitilizer 异常 谢谢 沙米卡 System
  • 随机化数组的有效方法 - Shuffle 代码

    我在面试中被问到这个问题 我给出了各种解决方案 但面试官并不相信 我有兴趣找到解决方案 请提出您的看法 问 编写一个高效的数据结构来实现 ipod 中的 shuffle 它必须播放所有歌曲 每次以不同的随机顺序播放 同一首歌曲不应重复 大部
  • 将 GitLab CI 变量写入文件

    我如何将 GitLab CI 变量写入配置文件 如下所示 test stage test script touch config json echo database DB NAME gt gt config json 变量无法解决 我总是
  • 如何在 Mac 10.8.3 上安装 qpdf?

    跑步时R CMD check在 Mac 构建服务器上的包上 我收到警告 qpdf is needed for checks on size reduction of PDFs 我似乎无法得到qpdf http sourceforge net
  • 自定义 SQL GROUP BY 子句

    我有一个非常定制的 SQL 查询 但在实现时遇到问题 我正在使用 SQL Server 2008 我在此查询中只有一张表 但我正在寻找非常具体的数据 该查询的要求是 对于每个不同的 PartNumber 列 我需要选择要选择的最新 最大 P
  • 如何让 LINQ 全外连接正常运行?

    我正在构建一个 WPF 应用程序来监视用户计算机上的目录 该应用程序从受监控的目录上传文件 然后将一些信息保存到 SQLite 数据库中 部分业务处理是对已经上传的文件不重新处理 对已经上传但自上次上传后发生变化的文件重新上传 我有两个构建
  • 在 C++ 中将值从 X 更改为 X 会导致数据争用吗?

    我有可处理具有不同布局的大数据块的代码 布局将决定哪些数据是固定的 哪些数据是不固定的 一旦数据被固定在一个块中 它通常就不会再改变 所以所有读取数据的代码总是会看到相同的数据 但是 其他服务可以在这些块中进行更改 只要它们确定没有代码将读