原子解锁访问.NET中的64位内存映射文件块

时间:2014-05-23 18:15:38

标签: c# multithreading synchronization memory-mapped-files interlocked

我们需要非常有效地共享两个流程之间不断变化的信息块。信息适合64位内存块 - 因此在一个进程中我们可以使用互锁操作(或者甚至可能只是普通的读/写)来确保无锁访问正确的信息状态(不仅仅是部分写入)。 / p>

如何在没有锁定和同步的情况下将64位数据块写入并准备好进入MMF,以确保我们不读取部分写入的数据? 这个大小的写入本身不是64位架构吗?但是对齐可能会使它成为非原子的,正确吗?

在MMF上使用Interlocked操作(例如通过这个问题中描述的方式:How to use interlocked operations against memory-mapped files in .Net)的方法是什么?但是,即使在这种情况下,我们也不能解决对齐问题(因为MMF是内存块,因此.NET可能无法控制它与变量一样对齐)?

1 个答案:

答案 0 :(得分:2)

  

为了确保我们不读取部分写入的数据,我们如何在没有锁定和同步的情况下编写和准备64位数据块到MMF中? Aren在64位架构上自己写这个大小的原子?但是对齐可能会使它成为非原子的,正确吗?

内存映射文件在页面对齐,因此请在MMF中保持数据对齐。然后,如果在具有64位指令的64位处理器上将64位整数写入64位对齐位置,则其他处理器不应该在该位置读取部分写入的值。

[编辑] 请参阅文章Managing Memory-Mapped File (MSDN),该文章将MMF文件的一种实现描述为系统页面文件。另请参阅this Wiki作为MMF的一般信息,其中指出MMF始终是页面对齐的。

  

使用Interlocked操作(例如,通过引用'问题:如何对MMF中的内存映射文件使用互锁操作)描述MMF的方式呢?   但是,即使在这种情况下,我们也不能解决对齐问题(因为MMF是内存块,因此.NET可能无法控制它与变量一样对齐)?

与您引用的示例不应存在对齐问题。