如果我在同一MemoryMappedFile
并行读写,会发生什么?是否有必要在阅读之前通过Mutext
锁定它们,如MSDN上的示例所示?
答案 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
打开时锁定整个内存映射文件。