Могу ли я иметь файл с отображением памяти, сопоставленный с двумя или более процессами одновременно (Windows)?

Мне нужно, чтобы два процесса обменивались информацией через файл с отображением памяти. Один из них будет только читать файл, а другой будет только писать в него. Могу ли я просто оставить файл всегда привязанным к этим двум процессам? Я в настоящее время:

  1. сопоставление файла с процессом чтения
  2. Письмо
  3. Удаление файла
  4. Сопоставление файла с процессом записи
  5. чтение
  6. Отмена карты

И повторять снова и снова каждый раз, когда мне нужны процессы для обмена информацией. Меня беспокоит то, что все эти вызовы map и unmap могут быть дорогими. Должен ли я постоянно сопоставлять файл с обоими процессами? Я мог регулировать доступ к разделяемой памяти через мьютексы.

Как лучше всего выполнить такую ​​задачу?


person cloudraven    schedule 12.03.2012    source источник


Ответы (2)


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

person Eugene Mayevski 'Callback    schedule 13.03.2012
comment
Ну, это так же синхронизировано, как и личные данные процесса, совместно используемые между потоками, то есть вам нужны барьеры памяти и синхронизация (блокировки или взаимосвязанные операции). - person Ben Voigt; 13.03.2012

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

person jdigital    schedule 12.03.2012
comment
Спасибо! Здравый совет. Мне нужно делать это десятки раз в секунду... вот почему я подумал, что это будет плохо. Но вы правы, мне пока не стоит смотреть на оптимизацию. - person cloudraven; 13.03.2012
comment
Не будет никаких проблем, если не разархивировать файл — MMF были специально разработаны для этого сценария использования. - person Eugene Mayevski 'Callback; 13.03.2012