- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
简化问题:
与内存屏障相比,互锁操作导致的内存缓存一致性(或“刷新”)时间是否存在差异?让我们在 C# 中考虑 - 任何互锁操作与 Thread.MemoryBarrier()。我相信是有区别的。
背景:
我阅读了很少关于内存屏障的信息 - 所有关于防止特定类型的内存交互指令重新排序的影响,但我找不到关于它们是否应该导致读取的立即刷新的一致信息/写队列。
我实际上发现很少有消息来源提到不保证操作的即时性(只保证防止特定的重新排序)。例如
Wikipedia :“但是,需要明确的是,这并不意味着任何操作都将在屏障完成时完成;仅保证操作完成的顺序(当它们完成时)”
Freebsd.org (障碍是特定于硬件的,所以我想特定的操作系统并不重要):“内存障碍只是确定内存操作的相对顺序;它们不对内存操作的时间做出任何保证”
另一方面,互锁操作 - 根据他们的定义 - 导致立即刷新所有内存缓冲区以保证更新变量的最新值导致内存子系统锁定整个缓存行的值,以防止从任何其他 CPU/核心访问(包括读取),直到操作完成。
我是对还是错?
免责声明:
这是我在这里的原始问题的演变 Variable freshness guarantee in .NET (volatile vs. volatile read)
编辑 1:修复了我关于联锁操作的陈述 - 内联文本。
编辑 2:完全删除演示代码+它的讨论(因为有些人提示信息太多)
最佳答案
要了解 C# 联锁操作,您需要了解 Win32 联锁操作。
“纯”互锁操作本身只会影响操作直接引用的数据的新鲜度。
但在 Win32 中,互锁操作过去常常表示完整的内存屏障。我相信这主要是为了避免在新硬件上破坏旧程序。所以 InterlockedAdd 做了两件事:互锁加法(非常便宜,不影响缓存)和全内存屏障(相当繁重的操作)。
后来,Microsoft 意识到这很昂贵,并添加了每个操作的版本,这些版本没有内存屏障或部分内存屏障。
所以现在(在 Win32 世界中)几乎所有东西都有四个版本:例如InterlockedAdd(全栅栏)、InterlockedAddAcquire(读栅栏)、InterlockedAddRelease(写栅栏)、纯InterlockedAddNoFence(无栅栏)。
在 C# 世界中,只有一个版本,它与“经典的”InterlockedAdd 相匹配——它也实现了完整的内存栅栏。
关于c# - 内存屏障与互锁对内存缓存一致性时序的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24726904/
我想选择一个类的所有元素。然后将该类更改为另一个类。 0.5 秒后,我想将元素恢复到原来的类。我必须连续这样做 8 次。即使我的代码实现了(以某种方式),我也看不到按钮的颜色变化。谁能帮我 ?我猜这是
我目前正在尝试用 C++ 编写一个 NES 模拟器,作为一个夏季编程项目,为下一学年的秋季学期做准备(我已经有一段时间没有编码了)。我已经编写了一个 Chip8 模拟器,所以我认为下一步是尝试编写一个
我有 2 个函数依次调用,x 和 y 是全局变量。 function setVariables() { x = 2; y = 10; }; function useVaria
我正在尝试以重复的方式播放 1000 毫秒的 wav 文件。因此,播放 1000 毫秒,然后播放 1000 毫秒的静音,然后再次播放 1000 毫秒的音频,... 但是当我在此过程中打印计时时,我注意
我正在为一个特殊的相机编写一个内核模块,通过 V4L2 处理帧到用户空间代码的传输。然后我在应用程序中做很多用户空间的事情。 时间在这里非常关键,所以我一直在做大量的性能分析和普通的旧 std::ch
据我了解,awakeFromNib 始终会在 viewDidLoad 之前调用。 所以我有一个 UITableViewController 的子类,它是从 xib 文件中取消存档的。 我在里面定义了这
我的powershell脚本运行缓慢,有什么办法可以分析powershell脚本吗? 最佳答案 在这里发布您的脚本真的有助于给出准确的答案。 您可以使用 Measure-Command 来查看脚本中每
我的CQRS / ES设计中有时间问题。为了便于讨论,让我们基于Microsoft的 有关此主题的示例, session 管理(https://msdn.microsoft.com/en-us/lib
我正在使用 RX 进行一些(非常基本的)事件订阅:- public void StartListening(IObservable observable) { subscription = ob
我会试着问我的问题,这样它就不会以一个简单的争论话题结束。 我最近进入了一个用 C# 编码的应用程序,我正在发现异常机制。我和他们有过一些不好的经历,比如以下 // _sValue is a stri
我正在阅读 Cortex M4 TRM 以了解指令执行周期。但是,那里有一些令人困惑的描述 在 Table of Processor Instuctions , STR需要 2 个周期 . 稍后在 L
我需要在 GPU 端处理一组绘图调用所需的时间跨度。 OpenGL 3.2+ 具有“GL_ARB_timer_query”扩展名。不幸的是,MacOSX 仍然不支持该扩展。 你如何能够在 gpu 端测
我正在 try catch 屏幕而不包括我的应用程序窗口。为此,我首先调用 setVisible(false),然后调用 createScreenCapture 方法,最后调用 setVisible(
我们试图实现的功能的简短描述:我们在左边有一个源对象列表,一个人可以将新项目从列表拖到右边的列表中,项目因此被添加到列表中在右侧;他们还可以从右侧的列表中删除项目。右侧的列表在更改时会被保存。 (我认
我是一名优秀的程序员,十分优秀!