Как правильно использовать CreateFileMapping и MapViewOfFile, если я намереваюсь получить доступ к нескольким частям файла несколькими процессами? - PullRequest
2 голосов
/ 21 января 2012

Я пишу компонент на C, который будет использоваться несколькими различными процессами, обращающимися к одному и тому же файлу.

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

Я пытаюсь выяснить, правильный ли путь:

Вариант А: Чтобы каждый процесс вызывал CreateFileMapping один раз для всего файла, а затем несколько раз использовал MapViewOfFile в разных разделах для доступа к нужным частям, то есть, если у меня есть 10 разделов, к которым я хочу получить доступ, я буду вызывать CreateFileMapping один раз для всего файла, от начала до конца и затем MapViewOfFile 10 раз, по одному разу для каждой части файла.

ИЛИ

Вариант B: Для каждого процесса, вызывающего CreateFileMapping & MapViewOfFile в каждом конкретном разделе, к которому он хочет получить доступ, то есть, если у меня есть 10 разделов, к которым я хочу получить доступ, я буду вызывать CreateFileMapping & MapViewOfFile каждые 10 раз.

Спасибо!

1 Ответ

4 голосов
/ 21 января 2012

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

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

Что-то, что вы можете захотеть прочитать и изучить образецкод: Общая память .Также попробуйте поиск в Google для MapViewOfFile + WaitForMultipleObjects для получения дополнительной информации.

...