从不同线程写入相邻的数组元素?

2024-04-12

是否有任何现代的常见 CPU 从不同线程同时写入数组的相邻元素是不安全的?我对 x86 特别感兴趣。您可能会认为编译器不会做任何明显荒谬的事情来增加内存粒度,即使它在技术上符合标准。

我对编写任意大结构的情况感兴趣,而不仅仅是本机类型。

Note:

请不要提及与虚假共享相关的性能问题。我很清楚这些,但它们对于我的用例来说没有实际意义。我还意识到从读取器以外的线程写入的数据的可见性问题。这已在我的代码中解决。

澄清:出现此问题是因为在某些处理器(例如旧的 DEC Alpha)上内存只能在字级寻址。因此,以非字大小增量(例如单个字节)写入内存实际上涉及要写入的字节的读取-修改-写入加上一些相邻的字节在引擎盖下。为了形象化这一点,请考虑写入单个位涉及到什么。您读入字节或字,对整个事物执行按位运算,然后将整个事物写回。因此,您无法从不同线程同时安全地写入相邻位。

从理论上讲,编译器在硬件不需要时以这种方式实现内存写入也是可能的,尽管完全愚蠢。 x86 可以寻址单个字节,所以这基本上不是问题,但我试图弄清楚是否存在任何奇怪的极端情况。更一般地说,我想知道从不同线程写入数组的相邻元素是否仍然是一个实际问题,或者主要只是一个理论问题,仅适用于模糊/古老的硬件和/或非常奇怪的编译器。

另一个编辑:这是一个很好的参考,描述了我正在谈论的问题:

http://my.safaribooksonline.com/book/programming/java/0321246780/threads-and-locks/ch17lev1sec6 http://my.safaribooksonline.com/book/programming/java/0321246780/threads-and-locks/ch17lev1sec6


写入本机大小的值(即 1、2、4 或 8 字节)是原子的(嗯,8 字节仅在 64 位计算机上是原子的)。所以不行。编写本机类型总是会按预期编写。

如果您正在编写多个本机类型(即循环写入数组),那么如果操作系统内核中存在错误或中断处理程序不保留所需的寄存器,则可能会出现错误。

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

从不同线程写入相邻的数组元素? 的相关文章

  • 在类中使用静态互斥体

    我有一个可以有很多实例的类 它在内部创建并初始化来自第三方库 使用一些全局变量 的一些成员 并且不是线程安全的 我考虑过使用 static boost mutex 它将被锁定在我的类构造函数和析构函数中 因此 在我的线程中创建和销毁实例对于
  • Angular Template:如何绑定 RXJS Observable 并读取其属性?

    我创建了这个界面 interface IGame name string description string 我将它用作 Observable 并将其传递为Input to the Component Input public game
  • 数百个空闲线程的影响

    我正在考虑使用可能数百个线程来实现通过网络管理设备的任务 这是一个在带有 Linux 内核的 powerpc 处理器上运行的 C 应用程序 在每个任务进行同步以将数据从设备复制到任务的初始阶段之后 任务变得空闲 并且仅在收到警报或需要更改一
  • 近调用/跳转表并不总是在引导加载程序中工作

    一般问题 我一直在开发一个简单的引导加载程序 并在某些环境中偶然发现了一个问题 在这些环境中 此类指令不起作用 mov si call tbl SI Call table pointer call call tbl Call print c
  • 构造函数中的同步块

    我有一个带有静态变量的类 如下所示 private static Object sMyStaticVar 如果我想在构造函数中为这个 var 赋值 我有这样的代码 if sMyStaticVar null sMyStaticVar new
  • 在 x86-64 CPU 上通过交叉修改代码重现意外行为

    Question 对于可能在 x86 或 x86 x64 系统上触发意外行为的交叉修改代码有哪些想法 在这些系统中 交叉修改代码中的所有操作均已正确完成 但在执行处理器之前执行序列化指令除外修改代码 如下所述 我有一个 Core 2 Duo
  • 多线程应用程序的调用方法?

    我的应用程序中有一个错误 与here http forums ni com t5 Measurement Studio for NET Waveform Graph quot X quot Error m p 217817 highligh
  • 跨线程操作无效 VB.NET

    我浏览了该网站 发现与该主题相关的问题是针对 C 的 我正在维护的应用程序是用 VB NET 编写的 因此 如果我忽略了一个问题 我深表歉意 这是我调用我的线程的地方 Private Sub saveBtn Click ByVal send
  • 如何使用 Python 从 Azure Functions 中的辅助线程重定向日志

    我正在使用 Azure 函数运行启动多个线程的 Python 脚本 出于性能原因 一切都按预期工作 但 Azure Functions 日志中仅显示来自 main 线程的信息日志 我在 main 中启动的 辅助 线程中使用的所有日志都不会出
  • 用于预乘 ARGB 的 SSE alpha 混合

    我正在尝试编写一个支持 SSE 的 alpha 合成器 这就是我想出的 首先 混合两个 4 像素向量的代码 alpha blend two 128 bit 16 byte SSE vectors containing 4 pre multi
  • Ruby IMAP IDLE 并发 - 如何解决?

    我正在尝试构建一个 目前是私有的 Web 应用程序 该应用程序将利用 IMAP IDLE 连接在人们到达时显示电子邮件 我很难弄清楚如何将其组合在一起 以及它如何与我的 Heroku RoR 服务器结合在一起 我编写了一个用于连接到 IMA
  • 验证随时间变化的连续条件

    我想开发一个Python程序 从某个时刻开始 等待60秒再执行操作 该程序必须具有的另一个功能是 如果我更新初始时间 它必须开始检查条件 我想过用线程来做 但我不知道如何停止线程并以新的开始时间重新启动它 import thread imp
  • 编写潜在并发问题的证明

    我正在阅读 Java 并发实践 并尝试编写一段代码来表明第 3 5 1 章中作为示例提供的类确实会引入问题 public class Holder public int n public Holder int n this n n publ
  • 在 asp.net MVC 控制器中调用异步外部 Web 服务

    在 Asp net MVC 控制器 GET 方法 中 我调用外部 Web 服务 用于 IP 地理定位 返回 IP 位置的 json 数据 如何使调用异步 以便堆栈可以在等待服务响应时继续 当 GEO IP 请求完成后 我希望能够更新数据库
  • 有没有好的带有 TaskExecutor 的 Spring 线程示例? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我试图了解如何在使用 Spring 进行事务管理的 Java 应用程序中实现线程 我在中找到了 Tas
  • Intel 64 和 IA-32 上的 MESI 有何意义

    MESI 的要点是保留共享内存系统的概念 然而 对于存储缓冲区 事情就变得复杂了 一旦数据到达 MESI 实现的缓存 下游内存就会保持一致 然而 在此之前 每个核心可能对内存位置 X 中的内容存在分歧 具体取决于每个核心的本地存储缓冲区中的
  • WaitForSingleObject 是否充当内存屏障?

    昨天一个关于双重检查锁定的问题引发了一系列的想法 让我对一个简单的情况感到不确定 在下面的代码中 是否可以点击printf 不再同步 在这个简单的示例中 这些值可能位于同一缓存行上 因此我认为这种可能性较小 假设一开始可能性 gt 0 如果
  • “rep stos”x86 汇编指令序列有什么作用?

    我最近偶然发现了以下汇编指令序列 rep stos dword ptr edi For ecx重复 存储内容eax到哪里edi指向 递增或递减edi 取决于方向标志 每次 4 个字节 通常 这用于memset型操作 通常 该指令简单地写成r
  • 从 C 线程调用 Python 代码

    我对从 C 或 C 线程调用 Python 代码时如何确保线程安全感到非常困惑 The Python 文档 http docs python org c api init html non python created threads似乎是
  • Android进程调度

    我试图更好地理解 以便在创建 Android 应用程序 服务时确定潜在的互操作性问题对可靠性的影响 我想弄清楚进程优先级是如何确定的 服务和活动之间优先级的差异以及调度程序是否以不同方式对待它们的优先级 基本上 我试图深入了解某个活动或服务

随机推荐

  • Angular 2 引导选项 - AOT 与 JIT

    刚开始使用 Angular 2 Angular 2 中的各种 Bootstrapping 选项有哪些 为什么当我进行更改并刷新时 index html 只需要很少的时间来检索 HTML 标记 它们之间的区别 有两种选择 动态引导 使用的编译
  • 如何为 Debian/Ubuntu 打包 Mono 应用程序

    是否有任何用于为 Debian Ubuntu 打包 Mono 应用程序的指南或工具 比如将应用程序附带的程序集放在哪里等 Mono 有一些关于打包的一般准则 但这些准则并非特定于 Debian Ubuntu 它们的做法可能有所不同 http
  • C:将x86指令放入数组并执行它们[重复]

    这个问题在这里已经有答案了 有没有办法将处理器指令放入数组中 使其内存段可执行并将其作为简单函数运行 int main char myarr 13 0x90 0xc3 void myfunc void myarr myfunc return
  • Google Calendar API - 通过服务帐户访问自己的日历

    我想访问 Google Calendar API 以使用 Python 插入条目 我创建了一个服务帐号在Google API控制台上 添加私钥 下载它 但是 当我尝试修改同一帐户上的任何日历时 我收到以下错误消息 读书作品 Code is
  • scala 框架中支持 PostgreSQL 特定的 array_agg 函数吗?

    是否有一些 scala 关系数据库框架 anorm squeryl 等 使用类似 postgres 的聚合器在分组后生成列表 或者至少模拟其使用 我期望有两个层次的实施 一个 标准 的 其中至少任何带有 array agg 的 SQL 分组
  • 我的 Rails 应用程序的捆绑包安装冻结

    有时 在使用 Rails 应用程序时 运行bundle install命令在处理 Rails Gemfile 时冻结 我尝试过清除缓存 但没有任何改善 请务必仔细检查并确保您声明的是 Rails 版本 如果不声明版本 Bundler 最终可
  • 将值传递给 Android 中的自定义视图

    Cheers 我有一个接收用户输入 2 个数字 宽度和高度 的应用程序 理论上根据该输入 我有一个应该绘制网格 宽度和高度 的自定义视图 Note 应在视图尝试绘制自身之前接收这两个值 这两个值不是恒定的 因此我认为 XML 方法没有帮助
  • 在 R 中使用 igraph 获取连接组件

    我想找到一张图的所有连接组件 其中组件具有多个元素 使用clusters给出不同集群的成员资格并使用cliques不给出连通分量 这是后续 R中列表的多重交集 https stackoverflow com questions 304065
  • C++ #include 语义

    这是同一预处理指令的多个问题 1 或 除了 MSDN 中找到的信息之外 include 指令 C C https msdn microsoft com en us library 36k2cdd4 aspx 1 a 这两种表示法有什么区别
  • 使用 java Spark 从 csv 读取列

    我尝试用java和spark读取csv 现在我这样做 String master local 2 String csvInput home username Downloads countrylist csv String csvOutpu
  • 单线程使用不同的连接参数写入不同的数据库

    我正在开发一个项目 其中不同的数据库中有三个具有不同模式的表 这意味着我有三个不同的连接参数来使用 JDBC 连接这三个表 让我们假设 对于表1 Username A Password B URL C Columns ID1 String
  • 使用 OpenSSL 进行加密,方式与 Java 相同

    我必须使用 bash 脚本加密字符串 就像使用 javax crypto Cipher 加密一样 在java中 我使用AES 256和密钥 0123456789 但是当我使用openssl时 我必须将 0123456789 转换为十六进制
  • 将图片插入 JTextPane

    在我的记事本应用程序中 我尝试添加图像 就好像它是JLabel into a JTextPane通过单击JMenuItem called Picture private class Picture implements ActionList
  • 如何向我的服务器添加线程?

    我是 Java 初学者 我有一个任务是构建 P2p 文件共享 Java 应用程序 我首先创建服务器和客户端 客户端可以向服务器发送消息 服务器做出响应 我相信下一步应该是将线程插入服务器类中 我阅读了所有相关内容并尝试了它 但我就是无法成功
  • 以编程方式比较图像 - lib 或类 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何使用Windows安全描述符来阻止执行其他应用程序?

    在我最近关于使用 CreateDesktop API 调用创建新桌面并在其中执行我自己的应用程序并防止其他应用程序在我的桌面中执行的问题之一中 有人指出我使用安全描述符 这里有人可以告诉我该怎么做吗 提前致谢 所有命名对象 包括您创建的桌面
  • 如何知道 QLineEdit 是否获得焦点?

    我想知道是否在QLineEdit一声点击 所以我想我应该重新实现以下函数 void QLineEdit focusInEvent QFocusEvent e virtual protected 我该怎么做呢 另外请告诉我如何使用focusI
  • 在Python中更改文件头的有效方法

    我正在尝试编写一个 python 脚本来更新一些大文件的标头 仅第一行 但是由于新标头不必与原始标头的大小 以字节为单位 相同 无论如何我可以更改标题而不触及大文件的其余部分 或者我必须通读所有内容并将它们写回文件 不 您可以在不触及整个文
  • Ember 中可靠的视图

    我有一个列出专辑的应用程序 当同时点击专辑时AlbumView and App overlay 也是一个视图 被显示 App overlay Ember View create 类似灯箱的叠加 and App AlbumView Ember
  • 从不同线程写入相邻的数组元素?

    是否有任何现代的常见 CPU 从不同线程同时写入数组的相邻元素是不安全的 我对 x86 特别感兴趣 您可能会认为编译器不会做任何明显荒谬的事情来增加内存粒度 即使它在技术上符合标准 我对编写任意大结构的情况感兴趣 而不仅仅是本机类型 Not