Что произойдет, если я буду читать и писать параллельно в том же MemoryMappedFile
? Нужно ли я блокировать их через Mutext
перед чтением, как показано в образцах на MSDN?Чтение и запись параллельно MemoryMappedFile
ответ
Каждого «View», созданный из памяти отображенного файла может быть доступен только в одном потоке, в то время, однако вы можете создать несколько потоков просматривать и каждый поток может писать или читать на него в том же время.
Однако, если несколько видов попытаться записать в одно и то же место одновременно, вы можете получить данные «перемешаны» друг с другом. Мьютекс в этом примере предназначен для предотвращения этого смешивания. Если одно приложение записывает только в файл, а другое только чтение, тогда нет необходимости в мьютексе, вам нужно только его для нескольких авторов.
Это был необходимый намек: «Если одно приложение записывает только файл, а другое только чтение, то нет необходимости в мьютексе, вам нужно только его для нескольких авторов». Спасибо! – BendEg
Короткий ответ заключается в том, что вы можете читать поврежденные данные или записывать поврежденные данные, и вы должны получить эксклюзивный доступ (например, Mutex
), если чтение и запись не синхронизированы (ugh!), Или, как известно, t попадание в те же части файла с отображением памяти.
Рассмотрите фрагмент данных со смещением 100, длина которого составляет 100 байт. Писатель начинает писать со смещением 0 до 150, а другой пишет от 180 до 300. Ваш читатель начинает читать 100 байт, пока писатели пишут. Что читается? Что, если другой писатель пишет от 180 до 300 одновременно. Что написано? Вероятно, чередующийся кусок поврежденных данных.
Классический способ решения этой проблемы заключается в блокировке считывающего устройства. В .NET, если вы делаете параллельные чтения и записи в рамках одного процесса, вы можете использовать ReaderWriterLockSlim
или старше ReaderWriterLock
.
Если вы хотите сделать это с помощью нескольких процессов, вы можете использовать FileStream.Lock()
и FileStream.Unlock()
. Более сложным решением было бы использовать комбинацию семафора и мьютекса. Следуйте ссылкам от this SO question для идей.
Даже в этом может быть недостаточно. Если ваш файл с отображением памяти используется процессом, который вы не контролируете (например, сторонним), вы можете получить коррупцию. Вышеприведенные решения являются примерами совместных алгоритмов (все стороны знают, что происходит и ведут себя соответственно).
Самый тяжелый способ заключается в блокировке всего файла с отображением памяти при открытии с использованием FileShare.None
.
- 1. Чтение и запись нескольких файлов параллельно
- 2. Чтение и письмо параллельно
- 3. C - запись и чтение из файла FIFO параллельно - неожиданное поведение
- 4. OpenNetCF и MemoryMappedFile
- 5. Чтение Flume spoolDir параллельно
- 6. Чтение файлов параллельно наблюдаемым
- 7. Чтение многих файлов параллельно
- 8. Использовать MemoryMappedFile как BinaryReader
- 9. Чтение и запись файла атомарно
- 10. Разница между BinaryFile и MemoryMappedFile?
- 11. Запись и чтение файла
- 12. Чтение и запись NSDecimalNumber
- 13. Запись и чтение Android
- 14. Чтение и запись файла
- 15. Чтение и запись видеофайлов
- 16. чтение и запись файла
- 17. Чтение и запись Writelog
- 18. Запись и чтение данных
- 19. Чтение и запись Календарь
- 20. Чтение и запись файла
- 21. Запись и чтение файла
- 22. Чтение с диска и обработка параллельно
- 23. чтение видеокадров параллельно с opencv и Python
- 24. Perl: чтение и обработка нескольких файлов параллельно
- 25. чтение и обработка файлов параллельно в R
- 26. Параллельно чтение и обработка файлов C#
- 27. Чтение данных параллельно с многопроцессом
- 28. Чтение и запись файла Parallely в C#
- 29. Тупик с потоком памяти MemoryMappedFile
- 30. Запись данных на диск параллельно?
Как вы записываете файл? Сам * файл *, конечно, может быть написан одновременно, один доступ к нему [«не гарантированно является потокобезопасным».] (Https://msdn.microsoft.com/en-us/library/system.io.memorymappedfiles .memorymappedviewaccessor% 28v = vs.110% 29.aspx) – JimmyB
Я хочу писать из одного приложения через 'BinaryWriter' и читать из другого приложения через' BinaryReader'. – BendEg
Вы пытаетесь использовать файл с отображением памяти как своего рода коммуникацию процесса? –