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