Windows: изменить размер общей памяти - PullRequest
7 голосов
/ 06 июня 2011

Когда я создаю сегмент общей памяти в Windows (например, CreateFileMapping(INVALID_HANDLE_VALUE, ...)), есть ли способ изменить его размер, кроме создания большего сегмента и копирования данных?

Я прочитал в MSDNчто сопоставления файлов имеют фиксированный размер, но есть ли какой-нибудь способ создать новое сопоставление в той же памяти?Как и в Linux, где вы можете использовать shm_open(), а затем ftruncate() и mmap() снова.

1 Ответ

6 голосов
/ 06 июня 2011

Короткий ответ - нет - вы не можете изменить размер сопоставления файла после его создания.Описанная вами последовательность создания / копирования - единственный способ выполнить это с помощью сопоставления файлов, подкрепленного файлом системного подкачки.

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

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

В конце концов, это та же старая история.Добавленная сложность против производительности.

...