【发布时间】:2016-11-21 04:58:48
【问题描述】:
如果我在同一个进程中为同一个文件创建 2 个单独的映射,指针会被共享吗?
换句话说:
LPCTSTR filename = //...
HANDLE file1 = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0);
HANDLE fileMapping1 = CreateFileMapping(file1, NULL, PAGE_READONLY, 0, 0, 0);
void* pointer1 = MapViewOfFile(fileMapping1, FILE_MAP_READ, 0, 0, 0);
CloseHandle(fileMapping1);
CloseHandle(file1);
HANDLE file2 = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0);
HANDLE fileMapping2 = CreateFileMapping(file2, NULL, PAGE_READONLY, 0, 0, 0);
void* pointer2 = MapViewOfFile(fileMapping2, FILE_MAP_READ, 0, 0, 0);
CloseHandle(fileMapping2);
CloseHandle(file2);
pointer1 是否会等于 pointer2?
我问的原因是我有几个线程需要在一个大 (300+MB) 文件中搜索,我想为此使用内存映射。但是该进程需要能够在旧的 32 位 xp 机器上运行,所以如果每个线程在虚拟内存中分配自己的副本,那么我可能会耗尽内存。
【问题讨论】:
-
由于同一个文件支持的文件映射保证在一个进程中是一致的(远程文件除外),我不明白为什么
pointer1不能指向同一个内存块作为pointer2。事实上,两个指针相同是实现一致性保证的最直接的方式。但是,无论哪种方式(关于指针的身份)都没有书面保证。 -
没有理由映射会导致相同的指针:分别映射/取消映射,后端的不同句柄。预计您总是会得到两个不同的指针被映射到相同的物理内存。
-
另外,在您的代码 sn-p 中,您应该希望
file2成为获取fileMapping2的参数,而不是file1(复制/粘贴的东西)。下一行也是一样。 -
@RomanR。是的,复制粘贴错误
-
@Roman
MapViewOfFile特别指出“源自同一文件支持的任何文件映射对象的文件视图是一致的”。文件映射对象和文件句柄都不需要共享。我也不明白您评论中的部分内容:“您总是将两个不同的指针映射到同一个物理内存。”
标签: winapi memory-mapped-files