У меня есть приложение .NET / native C ++. В настоящее время код C ++ выделяет память в куче по умолчанию, которая сохраняется в течение всего срока службы приложения. В основном функции / команды выполняются на C ++, что приводит к выделению / модификации текущей постоянной памяти. Я исследую способ отмены одной из этих функций / команд в середине выполнения. У нас есть сотни таких команд, и многие из них представляют собой очень сложный (устаревший) код.
Подход грубой силы, которого я пытаюсь избежать, заключается в изменении каждой команды / функции для проверки отмены и выполнения всей соответствующей очистки (освобождения памяти кучи). Я исследую многопоточный подход, в котором дополнительный поток получает запрос отмены и завершает поток выполнения команды. Я бы хотел, чтобы вся динамическая память была размещена в «частной куче» с использованием HeapCreate()
(Win32). Таким образом, частная куча может быть уничтожена потоком, обрабатывающим запрос отмены. Однако, если команда выполняется до завершения, мне нужно, чтобы динамическая память сохранялась. В этом случае я хотел бы сделать логический эквивалент «перемещения» частной памяти кучи в кучу по умолчанию / кучу процесса без затрат на фактическую копию. Это вообще возможно? Имеет ли это вообще смысл?
В качестве альтернативы я понимаю, что мог бы просто иметь новую частную кучу для каждого выполнения команды / функции (каждая будет новым потоком). Частная куча может быть уничтожена в случае отмены команды или сохранится, если команда завершится. Есть ли проблема с неограниченным ростом количества куч? Я знаю, что с каждой кучей связаны некоторые накладные расходы. С какими ограничениями я могу столкнуться?
Я использую 64-разрядную версию Windows 7 с 8 ГБ ОЗУ (считайте это целевой платформой). Приложение, с которым я работаю, составляет около 1 миллиона SLOC (половина C ++, половина C #). Я ищу любой опыт / предложения по управлению частной кучей или просто альтернативы моему решению.