2015-03-25 3 views
0

Я вроде новой для общей памяти и я искал рабочий пример, мне удалось найти только через MSDNКак использовать общую память правильно под окнами

На первом процессе я объявил мой общий память следующим образом:

hFileMapping = ::CreateFileMapping(INVALID_HANDLE_VALUE, nullptr, PAGE_READWRITE, 0, dwDataSize, strSharedMemoryName.c_str()); 
pBuffer = ::MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, dwDataSize); 
::CopyMemory(pBuffer, pData, dwDataSize); 

и на втором процессе:

HANDLE hFileMap = ::OpenFileMapping(FILE_MAP_READ, FALSE, strContentsSizeFileMap.c_str()); 
LPVOID pData = ::MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0); 

Я знаю, что когда я закончу работу над MAPview, мне нужно освободить его с помощью "UnmapViewOfFile() '. Мой вопрос: где именно?

  1. Родительский процесс?
  2. Детский процесс
  3. Оба?

Если это так, то ОС держит некоторое количество ссылок по адресу до того, как оно будет полностью выпущено?

Из MSDN:

Это также уменьшает количество акций соответствующей физической страницы

, который получил меня немного перепутали относительно того, что им на самом деле должны делать.

ответ

3

https://msdn.microsoft.com/en-us/library/windows/desktop/aa366537%28v=vs.85%29.aspx

функция CreateFileMapping
Создает или открывает именованный или безымянный объект отображения файла для указанного файла.
...
Создание объекта сопоставления файлов фактически не отображает представление в адресное пространство процесса. Функции MapViewOfFile и MapViewOfFileEx отображают представление файла в адресное пространство процесса.
...
Отображаемые виды объекта сопоставления файлов поддерживают внутренние ссылки на объект, а объект сопоставления файлов не закрывается до тех пор, пока не будут освобождены все ссылки на него. Поэтому, чтобы полностью закрыть объект сопоставления файлов, приложение должно отключить все сопоставленные представления объекта сопоставления файлов, вызвав UnmapViewOfFile и закрыть дескриптор объекта сопоставления файлов, вызвав CloseHandle. Эти функции можно вызывать в любом порядке.

Так что процесс №1 создает объект карты в операционной системе. Затем процесс №1 отображает некоторую часть этого в собственную память процесса.
Процесс № 2 получает дескриптор одного и того же объекта сопоставления операционной системы и отображает ту же часть или другую ее часть в свою собственную память.
Когда процесс завершен, они вызывают UnmapViewOfFile, который удаляет отображение из собственной памяти процесса, и они вызывают CloseHandle на свой дескриптор карты операционной системы.Обработки Windows все эффективно подсчитываются, поэтому, когда все процессы, имеющие дескриптор дескриптора CloseHandle, затем операционная система автоматически уничтожает объект карты.

Обратите внимание, что это означает, что если процесс №1 создает сопоставление, использует сопоставление, а затем завершает его полностью, а затем обрабатывает # 2 пытается открыть это сопоставление, процесс № 2 потерпит неудачу, поскольку операционная система удалила его, когда нет процессов были какие-то ручки. Чтобы обойти это, создайте файлы в файловой системе, чтобы вернуть свою память, что позволяет сохранять память между процессами, пока вы не удалите файл.

1

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

+0

Что делает UnmapViewOfFile в точности? он только освобождает адрес или освобождает память? если бы на первом процессе я заполнил буфер, а затем его не отобрал, будут ли те же данные присутствовать во втором процессе, как только i MapViewOfFile? –

+0

@igalk Он высвобождает адрес. Нет освобождения до тех пор, пока все процессы не исчезнут. Не знаю о вашем втором вопросе. –