MapViewOfFile不会导致从文件

时间:2017-04-25 14:39:00

标签: winapi mmap

我有一个代码,在重新映射之前使用MapViewOfFile和FlushViewOfFile写入文件。

我有第二个代码,它使用相同进程的其他线程中的MapViewOfFile从同一个文件(在磁盘上,而不是HANDLE / mapping对象)读取。

视图标记为PAGE_READONLY / FILE_READ和PAGE_READWRITE / FILE_WRITE。

在我的电脑上,一切都很好。 但是当同一个构建在其他PC上作为服务运行时,它有一个奇怪的错误: 当我重新映射阅读器(这意味着UnmapViewOfFile + MapViewOfFile)与offset == 0(读取一些文件头)时,它不会返回任何错误,但读取本身会返回一些旧值,这些值已被其他线程更改。 / p>

当我打开ProcessMonitor时,它显示没有来自offset = 0的读数,只有写入。

所以,问题是新调用CreateFileMapping / MapViewOfFile成功返回,但是映射了一些旧的缓存页面,并且没有从文件中读取新数据。

再一次,同样的构建在我的电脑上运行良好。

有人能提出什么建议吗?感谢。

1 个答案:

答案 0 :(得分:0)

来自documentation for MapViewOfFile

  

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

换句话说,您正在观察的行为符合预期。

此外:

  

不保证文件的映射视图与ReadFile或WriteFile函数访问的文件一致。

由于您需要通过网络进行一致性,因此无法使用文件映射。您必须使用ReadFile来读取内容,使用WriteFile来修改它们。您还应该使用LockFile或其他方法来协调对文件的访问,以确保您正在阅读的数据是一致的。

(你还应该注意,取消映射然后重新映射完全相同的视图是没用的。这基本上是一个无操作。)