与MemoryMappedFile并行读写

时间:2015-07-30 14:23:32

标签: c# ipc memory-mapped-files inter-process-communicat

如果我在同一MemoryMappedFile并行读写,会发生什么?是否有必要在阅读之前通过Mutext锁定它们,如MSDN上的示例所示?

Memory-Mapped Files

2 个答案:

答案 0 :(得分:3)

从内存映射文件创建的每个“视图”一次只能由一个线程访问,但是您可以创建多个视图流,并且每个线程可以同时写入或读取它。

但是,如果多个视图同时尝试写入同一位置,则可能会使数据彼此“混合”。示例中的互斥锁是为了防止混合。如果一个应用程序只写入文件而另一个只是读取,则不需要互斥锁,只需要多个编写器。

答案 1 :(得分:1)

简短的回答是,您可能会读取损坏的数据或写入损坏的数据,并且您必须获得独占访问权限(例如Mutex),除非读取和写入时间很好(呃!)或它&# 39;他们知道他们没有点击内存映射文件的相同部分。

  

考虑偏移100处的100个字节长的数据块。编写器开始在偏移0到150处写入,另一个写入从180到300.您的读者在编写器写入时开始读取100个字节。什么是读?如果另一位作家同时从180到300写作怎么办?写的是什么?可能是一个交错的损坏数据块。

解决此问题的经典方法是使用读写器锁定。在.NET中,如果您在单个流程中进行并行读写,则可以使用ReaderWriterLockSlim或更早的ReaderWriterLock

如果您想对多个流程执行此操作,可以使用FileStream.Lock()FileStream.Unlock()。更棘手的解决方案是使用信号量和互斥量的组合。请点击this SO question中的链接获取相关提示。

即使在这可能还不够。如果您的内存映射文件由您无法控制的进程(例如第三方)使用,那么您可能会受到损坏。上面的解决方案是合作算法的例子(所有各方都知道发生了什么,并相应地表现)。

最重要的方法是在使用FileShare.None打开时锁定整个内存映射文件。