使用CreateFileMapping + MapViewOfFile的共享内存

时间:2015-05-26 11:15:54

标签: winapi

我有两个主题:读者和作家。两者都通过CreateFileMapping + MapViewOfFile分配的内存进行通信。两者都相对快速地工作。两者都是异步的。

问题:读者不时会得到零值。而且我绝对相信这不是作家所提供的。作家提供的价值永远不会为零。

我相信当作家和读者试图同时访问内存时会发生这种情况。我希望“CreateFileMapping + MapViewOfFile”机制能自动解决这类问题。我错了吗?我是否需要添加事件以同步对共享内存的访问?

1 个答案:

答案 0 :(得分:0)

文件的视图在应用程序之间同步,如果支持文件是本地的。

MSDN

  

有一个重要的例外,从同一文件支持的任何文件映射对象派生的文件视图在特定时间是一致的或相同的。对于进程内的视图和由不同进程映射的视图,可以保证一致性。

     

该例外与远程文件有关。尽管CreateFileMapping可以与远程文件一起使用,但它并不能保持连贯性。例如,如果两台计算机都将文件映射为可写,并且两者都更改了同一页面,则每台计算机只能看到自己对该页面的写入。当数据在磁盘上更新时,它不会合并。

这当然只涉及完成的写入和读取。

  • 支持文件是本地的(包括:由交换文件支持)
  • 在写入成功返回
  • 之前,您没有尝试阅读

因此,如果 - 正如您所说 - 编写器和读取器运行异步,您可能需要自己的同步机制。

这可能是使用事件/突变,或者可能只是文件中的数据。

示例:

文件的内容是记录的环形缓冲区。在映射的存储区域的开头(或结尾),有一个写指针。

添加记录意味着

  1. 将新记录写入记忆
  2. 更新写指针
  3. 阅读记录意味着:

    1. 读取写指针以检测是否有新记录
    2. 如果有新记录,请阅读
    3. 订单很重要。对于环形缓冲区,通常还需要引入读指针以防止覆盖未读记录。

      确保测试写入/读取操作的返回值并相应地处理错误。

      请记住,内存映射文件访问可能会引发应用程序应该处理的访问冲突异常。