Вы можете обосновать это. Файл с отображением памяти — это просто кусок памяти в вашей программе, байты которого доступны более чем одному процессу. Они довольно неудобны в управляемом коде, поскольку этот фрагмент существует по определенному адресу. Что требует доступа к данным с помощью указателя, они табуированы в управляемом коде. MemoryMappedFileViewAccessor упаковывает этот указатель, он копирует данные из управляемой памяти в общую память. Обратите внимание, что это отменяет основную причину использования MMF и то, почему их поддержка так долго не появлялась в .NET. Убедитесь, что вместо этого вы не хотите использовать именованные каналы.
Итак, рассуждая об этом, MMF определенно не является потокобезопасным по своей конструкции, поскольку это общая память, точно так же, как глобальные переменные в вашем коде. Точно так же все пойдет не так, если потоки будут читать и писать в один и тот же раздел общей памяти. И вы также должны защищаться от этого точно так же, как блокировка, чтобы гарантировать, что только один поток может получить доступ к общему разделу.
Также обратите внимание, что вам необходимо реализовать эту блокировку между процессами, которые читают и пишут MMF. Что, как правило, болезненно, вы должны использовать именованный мьютекс, который создает «главный» процесс, и открывается «подчиненный» процесс. Вы не можете экономить на этом требовании блокировки. Примечательно, что вы никогда не упоминали об этом в своем вопросе, так что красный флаг.
В рамках одного процесса потоки, не имеющие доступа к одному и тому же разделу MMF, не могут мешать друг другу. Точно так же, как два потока, которые обращаются к разным переменным, не требуют никакой синхронизации. Пока они держат мьютекс, который гарантирует, что другой процесс не сможет записать в раздел. Обратите внимание, что это, вероятно, означает, что вы хотите использовать семафор для защиты доступа к MMF, а мьютекс может быть получен только одним потоком.
person
Hans Passant
schedule
03.05.2013