如果每个线程专用于一个文件,那么让每个线程为正在处理的一个文件创建自己的MMF是有意义的。仅由单个线程使用的资源更易于在线程内分配和销毁。但是,如果所有线程都从同一个文件读取,那么您不希望创建多个MMF,因为所有将要执行的操作都会乘以消耗的内存量并创建一致性问题(多个视图相同文件的一部分)。
对于在同一文件上运行的多个线程,您应该创建一次MMF并与多个线程共享MMF指针。
在多线程情况下按需分配会变得非常复杂,通常归结为需要锁定对受保护资源的每次访问。如果需要锁定,则可以快速打败运行多个独立线程的任何性能优势,前提是它们都必须排队并等待访问共享资源。
如果您可以在构建/启动线程之前分配共享资源,那么您通常不需要锁定访问资源,因为资源总是在线程需要它时出现。
所以,我会考虑在线程启动之前分配MMF,并在没有锁的情况下在所有线程之间共享MMF指针。
这也假定该文件是严格只读的 - 多个线程永远不会写回文件或MMF。多线程可以共享一个指向公共内存区域/ MMF的指针,以进行只读访问,而不存在任何线程并发问题。
与传统缓冲文件访问相比,要小心您对MMF性能的假设。如果您的整个文件数据适合可用的RAM,那么MMF对于随机访问模式的表现可能比缓冲文件I/O更高。如果文件数据比可用RAM大得多,那么与使用MMF相比,缓冲文件I/O对于随机访问可以更高性能。为什么?因为MMF对内存的使用很贪心。 MMF只能以4k页大小的块加载数据。缓冲文件I/O可以更精确地根据您的实际数据大小需求和模式进行调整。如果您的应用程序从文件中的100个不同的广泛分隔的位置加载512字节的数据,则即使您只需要512 * 100 = 50k的数据,MMF也必须加载4k * 100 = 400k字节的数据。在这种数据访问模式/用例中,MMF比传统文件I/O需要多10倍的数据传输和内存消耗。
MMF的主要吸引力往往是开发者的便利,而不是原始的表现。从MMF支持的指针读取对于开发人员来说通常比编写和调整面向块的文件I/O子系统更方便。只要您承认这一事实,使用这种技术就没有问题,因为它对开发人员来说简单方便。
感谢您的彻底解答!我纯粹处理阅读文件,这不是一个问题,我被要求看看MMF在我的特定实例中的影响,所以我会尝试并尽可能多地实现它,以便理解和好奇。道歉,如果我误解,你说我最好通过一个指针,MSDN文章使用“OpenExisting”在创建时给出的名称 - 有没有办法测试是否存在该名称的MMF?我不知道我将使用哪些文件,直到我已经进入线程为止,因为它现在写入的时间太晚了。 – 2013-03-06 17:09:30
对不起,指针参考 - 旧的Win32本地代码习惯很难实现。 ;> – dthorpe 2013-03-06 21:00:13
我的建议是,如果所有线程都将使用同一个文件并且只读取数据,那么您可能在所有线程中只使用一个MMF实例。例如,在线程启动之前调用MMF.CreateFromFile一次,并将该MMF对象实例与所有线程共享 - 例如,将MMF对象填充到线程可以到达的静态变量中。如果您不打算使用MMF的多个视图,那么您可能也可以在所有线程中共享一个视图。 – dthorpe 2013-03-06 21:04:06