Windows: изменить размер общей памяти

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

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

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам