首页 > 解决方案 > 内存映射文件只读时是否需要互斥锁?

问题描述

最近,我们的 windows c/c++ 应用程序发生了一些事情。

我们使用 DLL 将文件映射到页面文件,我们的应用程序通过内存映射读取这些共享文件。

当我们只运行一个应用程序实例时,一切都很好。

有时,当我们同时运行 24 个实例时,我们从映射的内存中什么也得不到(只是零)——但没有错误或异常。

似乎这个问题更多地发生在较慢的存储设备上。如果文件存储在较慢的设备中(例如 AWS 的 EFS),我们每次都会遇到大约 6/24 个实例的问题。但是如果我们将文件移动到 AWS 的 EBS,我们只会在 1/24 或 2/24 个实例中遇到这个问题,而且不是每次都出现。

我想在大规模访问期间可能存在一些冲突?这些只读文件是否需要互斥锁?

互斥锁仅用于保护可写对象,对吗?

更多信息:一切都发生在该 DLL 中。EXE 仅使用此 DLL 来获取 TRUE 或 FALSE。DLL用于判断某些给定数据是否属于某个文件。一些结构体描述了文件的数据结构,问题是某个结构体在不应该得到0的时候只是得到0,但不是每次都得到。我在 DLL 中记录了参数,它们每次都正确传递给 DLL。

标签: c++cwindowswinapi

解决方案


最后,我想通了。

这不是内存映射文件问题,而是逻辑问题。

我们的 DLL 没有足够的权限,所以当我们将数据共享到内存中时,没有人可以看到它们!

而我们的应用程序被设计成在找不到任何共享数据的情况下自行加载数据,因此出现了 EFS 和 EBS 的差异!

这些应用程序很旧,没有留下任何文档,也没有人知道它们是如何工作的,所以我不得不从源代码中挖掘信息......


推荐阅读