如果我打算通过多个进程访问文件的多个部分,那么使用CreateFileMapping和MapViewOfFile的正确方法是什么?

时间:2012-01-21 10:17:29

标签: c windows winapi io memory-mapped-files

我正在用C编写一个组件,它将被几个不同进程使用,所有进程都访问同一个文件。

每个进程将同时访问文件的不同部分,主要用于阅读和写作。

我试图找出正确的方法:

意见A: 对于为整个文件调用一次CreateFileMapping的每个进程,然后在不同的部分多次使用MapViewOfFile来访问它需要的部分,这意味着如果我有10个部分我想访问,我将为整个文件调用CreateFileMapping一次,端到端,然后MapViewOfFile 10次,一次为文件的每个部分。

OR

选项B: 对于每个进程调用CreateFileMapping& MapViewOfFile在它希望访问的每个特定部分上,这意味着如果我有10个部分我想访问,我将调用CreateFileMapping& MapViewOfFile每次10次。

谢谢!

1 个答案:

答案 0 :(得分:4)

您必须至少每个进程调用一次CreateFileMappingMapViewOfFile才能访问数据。但是,您不需要再调用它们一次。当然,如果映射本身很大,您可能需要取消映射并重新映射以保存虚拟地址空间,但如果数据量不是那么大,则可以跳过此步骤。

映射文件映射后,您的进程会直接查看数据。读取和写入操作立即发生,为了序列化访问并防止线程竞争条件,您需要使用Interprocess Communication,例如信号量。

您可能想要阅读并研究示例代码的内容:Shared Memory。另请尝试使用Google搜索MapViewOfFile + WaitForMultipleObjects以获取更多信息。