【发布时间】:2014-09-03 19:13:38
【问题描述】:
简化问题:
与内存屏障相比,由互锁操作引起的内存缓存一致性(或“刷新”)的时序是否存在差异?让我们在 C# 中考虑 - 任何互锁操作与 Thread.MemoryBarrier()。我相信是有区别的。
背景:
我阅读了很少的关于内存屏障的信息 - 对防止特定类型的内存交互指令重新排序的所有影响,但我找不到关于它们是否应该导致 立即 刷新读取的一致信息/写队列。
我实际上发现很少有消息来源提到不能保证操作的即时性(只保证防止特定的重新排序)。 例如
Wikipedia: “但是,需要明确的是,这并不意味着任何操作都会在障碍完成时完成;只有操作完成的顺序(当它们完成时)才能得到保证”
Freebsd.org(屏障是特定于硬件的,所以我猜特定的操作系统并不重要):“内存屏障只是确定内存操作的相对顺序;它们不保证内存操作的时间”
另一方面,互锁操作 - 根据它们的定义 - 导致立即刷新所有内存缓冲区以保证变量的最新值已更新 导致内存子系统使用该值锁定整个缓存行, 以防止来自任何其他 CPU/内核的访问(包括读取),直到操作完成。
我是对还是错?
免责声明:
这是我最初的问题的演变Variable freshness guarantee in .NET (volatile vs. volatile read)
EDIT1: 修正了我关于联锁操作的声明 - 内联文本。
EDIT2: 完全删除演示代码+它的讨论(因为有些人抱怨信息太多)
【问题讨论】:
-
“另一方面,互锁操作——根据它们的定义——会导致立即刷新所有内存缓冲区以保证变量的最新值已更新”——哪个定义?据我所知,唯一的保证是操作是原子的。
-
@dcastro 这是一个公平的观点!我关于 Interlocked 的陈述不正确 - 我编辑了我的问题并试图解决它。基本上,互锁操作需要对整个缓存行进行独占访问(有效地防止任何可能的过时读取),但是 - 据我所知 - 对于(任何类型的)内存屏障或易失性变量来说,情况并非如此。
-
信息太多了。如果您想要一个好的答案,请使用:stackoverflow.com/questions/how-to-ask
-
这是一个公平的观点,因为文档没有说明任何内容(对于这样的事情真的是一个很大的遗漏)。 win32 等价物确实 - 不必要地 - 创建完整的内存屏障,而不是更合理的获取/释放语义..
-
@NebulaeGuy 我完全删除了代码示例 + 讨论。请让我知道这是否足以恢复反对票(如果是你的)。请记住,这个主题非常复杂 - 所以它需要一些参考资料。谢谢
标签: c# multithreading memory-barriers interlocked