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

本文关键字:映射 内存 文件 net 解锁 访问 64位 | 更新日期: 2023-09-27 18:04:54

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

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

那么,在MMF上使用联锁操作(例如,通过这个问题中描述的方式:如何对。net中的内存映射文件使用联锁操作)是正确的方法吗?但是,即使在这种情况下,我们也不能有对齐的问题(因为MMF是内存块,所以。net可能无法控制它与变量一样对齐)?

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

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

内存映射文件在封面下是页面对齐的,所以在MMF中保持数据对齐。然后,如果您在64位处理器上使用64位指令将64位整数写入64位对齐的位置,则其他处理器不应该有机会在该位置读取部分写入的值。

[编辑]请参阅文章管理内存映射文件(MSDN),其中描述了MMF文件作为系统页面文件的一种实现。也可以在这个Wiki上看到关于MMF的一般信息,其中指出MMF始终是对齐的。

那么在MMF上使用联锁操作(例如通过"引用"问题中描述的方式:如何对。net中的内存映射文件使用联锁操作)是该走的路吗?但是,即使在这种情况下,我们也不能有对齐的问题(因为MMF是内存块,所以。net可能无法控制它与变量一样对齐)?

你所引用的例子不应该有任何对齐问题。