2015-07-30 4 views
2

Что произойдет, если я буду читать и писать параллельно в том же MemoryMappedFile? Нужно ли я блокировать их через Mutext перед чтением, как показано в образцах на MSDN?Чтение и запись параллельно MemoryMappedFile

Memory-Mapped Files

+0

Как вы записываете файл? Сам * файл *, конечно, может быть написан одновременно, один доступ к нему [«не гарантированно является потокобезопасным».] (Https://msdn.microsoft.com/en-us/library/system.io.memorymappedfiles .memorymappedviewaccessor% 28v = vs.110% 29.aspx) – JimmyB

+0

Я хочу писать из одного приложения через 'BinaryWriter' и читать из другого приложения через' BinaryReader'. – BendEg

+0

Вы пытаетесь использовать файл с отображением памяти как своего рода коммуникацию процесса? –

ответ

3

Каждого «View», созданный из памяти отображенного файла может быть доступен только в одном потоке, в то время, однако вы можете создать несколько потоков просматривать и каждый поток может писать или читать на него в том же время.

Однако, если несколько видов попытаться записать в одно и то же место одновременно, вы можете получить данные «перемешаны» друг с другом. Мьютекс в этом примере предназначен для предотвращения этого смешивания. Если одно приложение записывает только в файл, а другое только чтение, тогда нет необходимости в мьютексе, вам нужно только его для нескольких авторов.

+0

Это был необходимый намек: «Если одно приложение записывает только файл, а другое только чтение, то нет необходимости в мьютексе, вам нужно только его для нескольких авторов». Спасибо! – BendEg

1

Короткий ответ заключается в том, что вы можете читать поврежденные данные или записывать поврежденные данные, и вы должны получить эксклюзивный доступ (например, Mutex), если чтение и запись не синхронизированы (ugh!), Или, как известно, t попадание в те же части файла с отображением памяти.

Рассмотрите фрагмент данных со смещением 100, длина которого составляет 100 байт. Писатель начинает писать со смещением 0 до 150, а другой пишет от 180 до 300. Ваш читатель начинает читать 100 байт, пока писатели пишут. Что читается? Что, если другой писатель пишет от 180 до 300 одновременно. Что написано? Вероятно, чередующийся кусок поврежденных данных.

Классический способ решения этой проблемы заключается в блокировке считывающего устройства. В .NET, если вы делаете параллельные чтения и записи в рамках одного процесса, вы можете использовать ReaderWriterLockSlim или старше ReaderWriterLock.

Если вы хотите сделать это с помощью нескольких процессов, вы можете использовать FileStream.Lock() и FileStream.Unlock(). Более сложным решением было бы использовать комбинацию семафора и мьютекса. Следуйте ссылкам от this SO question для идей.

Даже в этом может быть недостаточно. Если ваш файл с отображением памяти используется процессом, который вы не контролируете (например, сторонним), вы можете получить коррупцию. Вышеприведенные решения являются примерами совместных алгоритмов (все стороны знают, что происходит и ведут себя соответственно).

Самый тяжелый способ заключается в блокировке всего файла с отображением памяти при открытии с использованием FileShare.None.

Смежные вопросы