与MemoryMappedFile并行读写
本文关键字:读写 并行 MemoryMappedFile | 更新日期: 2023-09-27 18:05:39
如果我在同一个MemoryMappedFile
中并行读写会发生什么?在阅读MSDN上的示例之前,我有必要通过Mutext
锁定它们吗?
内存映射文件
从内存映射文件中创建的每个"View"一次只能由单个线程访问,但是您可以创建多个View流,每个线程可以同时对其写入或读取。
然而,如果多个视图试图同时写同一个位置,你可能会得到彼此"混合"的数据。这个例子中的互斥锁就是为了防止这种混合。如果一个应用程序只写入文件,而另一个应用程序只读取文件,那么就不需要互斥锁了,你只需要多个写入器。
简短的回答是,您可能读取损坏的数据或写入损坏的数据,并且您必须获得独占访问(例如Mutex
),除非读取和写入是定时的(咳!)或者知道它们没有触及内存映射文件的相同部分。
解决这个问题的经典方法是使用读写锁。在。net中,如果您在单个进程中进行并行读写,则可以使用考虑偏移量为100的数据块,长度为100字节。一个写入器从偏移量0到150开始写入,另一个从180到300开始写入。当写入器写入时,读取器开始读取这100字节。读什么?如果另一个作家在同一时间从180到300写呢?写了什么?可能是一个交错的损坏数据块。
ReaderWriterLockSlim
或较旧的ReaderWriterLock
。
如果你想在多个进程中这样做,你可以使用FileStream.Lock()
和FileStream.Unlock()
。一个更棘手的解决方案是使用信号量和互斥锁的组合。点击这个问题的链接寻找想法。
即使这样也可能还不够。如果你的内存映射文件被一个你不控制的进程使用(例如第三方),那么你可能会得到损坏。上面的解决方案是合作算法的例子(所有各方都知道发生了什么,并采取相应的行动)。
最繁重的方法是在使用FileShare.None
打开时锁定整个内存映射文件。