是否可以在不使用偏移量的情况下将指针存储在共享内存中?

2023-11-21

当使用共享内存时,每个进程可以将共享区域映射到其各自地址空间的不同区域。这意味着当在共享区域中存储指针时,您需要将它们存储为偏移量共享区域的开始。不幸的是,这使原子指令的使用变得复杂(例如,如果您尝试编写一个无锁算法)。例如,假设共享内存中有一堆引用计数节点,由单个编写器创建。写入器定期自动更新指针“p”以指向具有正引用计数的有效节点。读者希望以原子方式写入“p”,因为它指向第一个元素是引用计数的节点(结构)的开头。由于 p 始终指向有效节点,因此增加引用计数是安全的,并且可以安全地取消引用“p”并访问其他成员。然而,这一切仅当所有内容都位于同一地址空间时才有效。如果节点和“p”指针存储在共享内存中,则客户端会遇到竞争条件:

  1. x = 读取 p
  2. y = x + 偏移量
  3. 在 y 处增加重新计数

在步骤 2 期间,p 可能会发生变化,并且 x 可能不再指向有效节点。我能想到的唯一解决方法是以某种方式强制所有进程就共享内存的映射位置达成一致,以便真正的指针而不是偏移量可以存储在 mmap 区域中。有什么办法可以做到这一点吗?我在 mmap 文档中看到 MAP_FIXED,但我不知道如何选择一个安全的地址。

编辑:在 x86 上使用内联汇编和“锁定”前缀也许可以构建“增量 ptr X,偏移 Y 值 Z”?其他架构上的等效选项?没有写过很多汇编,不知道需要的指令是否存在。


在低级别上,x86 原子指令可以一次执行所有此树步骤:

  1. x = 读取 p
  2. y = x + 偏移增量
  3. y 处的重新计数
//
      mov  edi, Destination
      mov  edx, DataOffset
      mov  ecx, NewData
 @Repeat:
      mov  eax, [edi + edx]    //load OldData
//Here you can also increment eax and save to [edi + edx]          
      lock cmpxchg dword ptr [edi + edx], ecx
      jnz  @Repeat
//
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以在不使用偏移量的情况下将指针存储在共享内存中? 的相关文章

  • 我究竟做错了什么? (多线程)

    简而言之 这就是我正在做的事情 在我班级的 cpp 文件中 我有 std vector
  • Java 同步计数器 - get() 怎么样?

    众所周知这么简单x 不是原子操作 实际上是读 增量 写操作 这就是为什么它应该同步 但是关于get 我读过它也应该同步 但有人能解释一下为什么吗 通过引入来避免内存一致性错误happens before关系 当出现以下情况时该怎么办get
  • 在 WPF 中处理第二个 UI 线程

    我有一个长时间运行的进程在我的 UI 线程上运行 我无法离开 UI 线程 相反 我尝试创建第二个具有等待动画的 UI 线程 这是我用来创建第二个 UI 线程的代码 Private busyThread As Thread Private w
  • mmap 和 gzip 可以协作吗?

    我试图弄清楚如何将 mmap 与 gzip 压缩文件一起使用 这可能吗 import mmap import os import gzip filename r C temp data gz file gzip open filename
  • C# 显示对话框线程

    我有一个Dialog Box 导入器 我用它来选择要导入到应用程序中的文件 这Dialog Box 导入器 还有另一个对话框 文件 它是OpenFileDialog 代码运行如下 Main File if Importer ShowDial
  • 信号量如何工作?

    信号量可以小于0吗 我的意思是 假设我有一个 N 3 的信号量 并且我调用 down 4 次 那么 N 将保持为 0 但一个进程将被阻塞 反之亦然 如果一开始我调用 N 可以大于 3 吗 因为在我看来 如果 N 可以高于 3 如果一开始我调
  • 在 .NET 4.0 中将任务与 Parallel.Foreach 一起使用

    我开始尝试向 Windows 窗体添加一个进度条 以更新 Parallel Foreach 循环中运行的代码的进度 为此 UI 线程必须可用于更新进度条 我使用 Task 来运行 Parallel Foreach 循环 以允许 UI 线程更
  • 如何在 bash 脚本中使用并行编程/多线程?

    这是我的脚本 bin bash script to loop through directories to merge fastq files sourcedir path to source destdir path to dest fo
  • Dart 是单线程的,但为什么它使用 Future 对象并执行异步操作

    在文档中 Dart 是单线程的 但为了一次执行两个操作 我们使用与线程相同工作的 future 对象 使用Future对象 futures 来执行异步操作 如果 Dart 是单线程的 那么为什么它允许执行异步操作 Note 异步操作是并行操
  • 唤醒单个线程而不是 pthread 中的忙等待

    我不确定标题是否反映了我在这里提出的问题 但这是我在没有很长的标题的情况下能做的最好的事情 我正在尝试实施一个worker thread模型中pthreads 我想从中产生一组线程main函数以及此后的main线程将工作委托给工作人员 并等
  • 通过不同的线程使用多个 ORB(多线程多 Orb 客户端应用程序) - 如何?

    This question is related to Is it possible to have several ORB objects in the same process https stackoverflow com quest
  • 使用 MinGW gcc 4.4.0 增强 thread_interrupted 异常终止(),使用 3.4.5 则正常

    今天我一直在 玩弄 boost 线程作为学习练习 并且我有一个几个月前构建的工作示例 在我被打断并不得不暂时放弃多线程之前 它显示了不寻常的行为 当我最初编写它时 我使用的是 MingW gcc 3 4 5 并且它有效 现在我正在使用 4
  • 当我们调用 Thread.start() 时真正发生了什么[重复]

    这个问题在这里已经有答案了 正如问题标题所说 我想知道当我们调用 Thread start 时内部发生了什么 以及 start 方法何时返回以及 main 恢复执行 内部会触发什么内容 例如向调度程序注册线程等 另外为什么要使用执行者 你打
  • 发布/订阅架构

    我尝试编写一个发布 订阅系统 客户端和服务器端 其中客户端接收定期更新 如心跳 消息控制 并可以向服务器发出命令 订阅某些源 这样做的好方法是什么 我已经有一个实现线程池的服务器来管理传入的客户端连接 我想知道如何处理连接双方都可以在 Ne
  • 如何在反应式扩展中同时选择头部和尾部

    我想创建以下组合器 public static IObservable u HeadTailSelect u
  • 类和互斥体

    假设我有一个类代表一些名为 foo 的数据结构 class foo public foo attr01 0 void f attr01 5 private int attr01 class fooSingleThreadUserClass
  • Android SurfaceView 使用线程绘制画布

    我正在尝试使用线程在画布上绘图来创建一个简单的游戏引擎 但我遇到了一些无法解释的奇怪问题 这个 游戏 的目的是每秒在画布上画一个圆圈 这是可行的 但不是我想要的工作方式 似乎应用程序正在两个画布之间切换 并向每个画布添加一个圆圈 这样您就可
  • Python Tkinter,停止线程函数

    我目前正在为 3D 打印机开发 GUI 并且遇到如何停止线程函数的问题 我希望能够单击 GUI 中具有另一个功能的按钮 该按钮将阻止线程函数通过串行端口发送 G 代码字符串 目前 该函数已合并线程 以允许在打印期间触发其他函数 我非常感谢有
  • 原始类型是易失性的还是同步的?

    在 Java 中 如果变量的大小小于或等于 32 位 则赋值是原子的 但如果变量的大小大于 32 位 则赋值不是原子的 在双重或长分配的情况下 使用什么 易失性 同步 会更有效 Like volatile double x y 同步不适用于
  • 线程安全的异步字节队列

    我有一个回调方法 只要有新数据可用 就会调用该方法 public delegate void DataCallback byte buffer int offset int count 我想将其包装在一个实现与此类似的接口的类中 publi

随机推荐

  • 如何使用 Content-MD5 将对象放入 s3

    我尝试使用 boto3 将 XML 文件上传到 S3 根据亚马逊的建议 我想发送数据的 Base64 编码 MD5 128 位摘要 Content MD5 https docs aws amazon com AmazonS3 latest
  • Laravel 与 Docker 连接 MySQL 的问题

    我使用 Docker 设置 Laravel 的步骤 在我的本地系统中 我没有安装 PHP Composer Apache MySQL phpMyAdmin 等 我的系统中只安装了 Git 和 Docker 克隆https github co
  • xdebug.start_start_with_request=yes 如果调试客户端未侦听,则不会出现错误

    我曾经对 Xdebug 2 有以下配置 xdebug default enable 1 当没有调试客户端正在侦听时 Xdebug 不会减慢执行速度 但是当我需要调试某些内容时 我只需在 PhpStorm 中启用侦听并刷新页面即可 为此不需要
  • 如何使用 SwiftUI 和组合检测日期选择器的值变化?

    在使用 SwiftUI 和合并时 如何检测日期选择器值的变化 每当移动日期选择器轮时 我需要调用一个方法 以更新文本和滑块 我已经寻找了特定的方法来识别值的变化 使用 UIKit 可以将操作与事件关联起来 但显然我没有在文档中找到任何有用的
  • 为什么 hibernate 执行两个查询来急切加载 @OneToOne 双向关联?

    我有一个实体 A 它有一个 B 实体 而 B 有一个带有 OneToOne 双向关联的 A 现在 当我找到所有 A 记录时 hibernate 会在 B 上使用左外连接执行两个查询 如下所示 select a id a id b a fie
  • 使用 PHP 和 C# 进行 Mcrypt 和 Base64

    我在两个平台上编写了相同的方法 我相信这应该会产生相同的结果 但它没有发生 我用相同的密钥加密了相同的文本 但结果不同 有人能弄清楚为什么会发生吗 String 这是测试 Key 1234567812345678 PHP加密字符串 ybUa
  • R随机将数据分成两部分

    我试图将我的数据框随机分成两部分 例如 我想将随机 70 的数据放入一个数据框中 将另外 30 的数据放入另一个数据框中 有没有快速的方法来做到这一点 原始数据帧中的行数超过 800000 我尝试使用 for 循环 从行数中选择一个随机数
  • 在特定位置截断 UILabel

    我使用表格视图显示书籍列表 其中每个单元格都有一个UILabel显示书名和另一本书UILabel显示该书的作者 我的问题是关于作者标签的 一本书可以有多个作者 我希望它的行为如下 如果书只有一位作者 约翰 科尔曼 标签应为 约翰 科尔曼 如
  • 需要默认选择 Angular JS 单选按钮

    我是 Angular JS 的新手 我正在尝试创建一组单选按钮 创建按钮是很容易的部分 但我在弄清楚如何默认选择其中一个而不破坏所有内容时遇到问题 我已经在 Angular 文档和多个其他 stackoverflow 问题中阅读了有关使用
  • 临时约束需要需要需要需要吗?

    假设我正在编写一个类模板 其中一些成员的存在受到限制和价值类型模板参数 static constexpr 数据成员的 template
  • 如何在没有连接的情况下同步管理器/工作线程?

    我熟悉多线程 并成功地用 Java 和 Objective C 开发了许多多线程程序 但如果不使用主线程的连接 我无法使用 pthreads 在 C 中实现以下目标 include
  • Angular 5 - 如何在 DatePipe 中使周期字段类型小写

    在 Angular 5 1 中使用 DatePipe 我需要将周期字段类型 AM PM 设置为小写格式 根据文档 Tuesday December 19 7 00 am 应该 date EEEE MMMM d h mm a 但是 句点字段类
  • 更改 Java printf 中的默认填充字符?

    如果我们这样做System out printf 10s 1 默认情况下 会添加空格字符来填充10 对吧 有办法改变这个吗 我知道 你可以添加0 通过指定0之前s 但是确实printf支持其他什么吗 没有 空间是硬编码的 这是 java u
  • PHP 函数参数错误抑制、empty() isset() 模拟

    我很确定这个问题的答案是否定的 但万一有一些 PHP 大师 是否可以以一种可以传入无效参数或不存在的变量的方式编写一个函数 并且在不使用 php 的情况下不会出错 就像empty和isset一样 你可以传入你刚刚编写的变量 不会出错 ex
  • 表单主题日期时间小部件 Symfony 2

    我喜欢在表单中 形成主题 我的日期时间小部件 我创建了一个 fields html twig 文件 其中包含以下内容 block datetime widget spaceless div day month year replace da
  • strptime、as.POSIXct 和 as.Date 返回意外的 NA

    当我尝试解析以下格式的时间戳时 Thu Nov 8 15 41 45 2012 仅NA被返回 我使用的是 Mac OS X R 2 15 2 和 Rstudio 0 97 237 我的操作系统的语言是荷兰语 我认为这与它有关 当我尝试时st
  • 脚本 @php artisan package:discover --ansi 处理返回的 post-autoload-dump 事件,错误代码为 -1073741819

    从我的 github 中拉出一个项目后 我收到了一些奇怪的错误代码 我做的第一件事是composer dumpautoload composer update and php artisan migrate fresh seed每当我到达新
  • Django:内置密码重置视图

    我正在遵循文档 当我单击页面以重新启动密码时 出现 NoReverseMatch 错误 resetpassword 处无反向匹配 与 password reset done 相反 未找到参数 和关键字参数 尝试了 0 个模式 urls py
  • iOS 分发证书过期会怎样?

    我现在正在向 iTunes connect 提交 iPhone 应用程序 我有一个关于分发证书的问题 如果分发证书过期会发生什么 用户购买的应用程序在证书过期后会停止运行或崩溃吗 或者分发证书过期后用户无法安装应用程序或无法从App Sto
  • 是否可以在不使用偏移量的情况下将指针存储在共享内存中?

    当使用共享内存时 每个进程可以将共享区域映射到其各自地址空间的不同区域 这意味着当在共享区域中存储指针时 您需要将它们存储为偏移量共享区域的开始 不幸的是 这使原子指令的使用变得复杂 例如 如果您尝试编写一个无锁算法 例如 假设共享内存中有