Tengo una aplicación .NET/C++ nativa. Actualmente, el código C++ asigna memoria en el montón predeterminado que persiste durante la vida de la aplicación. Básicamente, las funciones/comandos se ejecutan en C++ lo que da como resultado la asignación/modificación de la memoria persistente actual. Estoy investigando un enfoque para cancelar una de estas funciones/comandos a mediados de la ejecución. Tenemos cientos de estos comandos, y muchos son código muy complicado (heredado).¿Puede Win32 "mover" la memoria asignada en el montón?
El enfoque de fuerza bruta que trato de evitar es modificar cada comando/función para verificar la cancelación y hacer toda la limpieza adecuada (liberar la memoria del montón). Estoy investigando un enfoque de subprocesos múltiples en el que un subproceso adicional recibe la solicitud de cancelación y finaliza el subproceso de ejecución de comandos. Me gustaría que toda la memoria dinámica se asignara en un "montón privado" usando HeapCreate()
(Win32). De esta forma, el heap privado podría ser destruido por el hilo que maneja la solicitud de cancelación. Sin embargo, si el comando se ejecuta hasta completarse, necesito que la memoria dinámica persista. En este caso, me gustaría hacer el equivalente lógico de "mover" la memoria de pila privada al montón predeterminado/de proceso sin incurrir en el costo de una copia real. ¿Es esto de alguna manera posible? ¿Esto tiene sentido?
Como alternativa, reconozco que podría tener un nuevo montón privado para cada ejecución de comando/función (cada uno será un nuevo hilo). El montón privado podría destruirse si el comando se cancela o podría sobrevivir si el comando finaliza. ¿Hay algún problema con el número de montones creciendo indefinidamente? Sé que hay algunos gastos generales involucrados con cada montón. ¿Con qué limitaciones me puedo encontrar?
Funciono en Windows 7 de 64 bits con 8GB de RAM (considere esto la plataforma de destino). La aplicación con la que estoy trabajando es de aproximadamente 1 millón de SLOC (la mitad de C++, la mitad de C#). Estoy buscando cualquier experiencia/sugerencia con gestión de pila privada, o solo alternativas a mi solución.
¿Está preguntando si la memoria que asigna en un montón puede "reasignarse" a otro montón sin copiar realmente los datos? –
Estoy 92% seguro de que la respuesta es no. Pero no lo suficiente como para publicarlo como respuesta. –
La asignación de memoria de montón no es el único problema que tendrá con la terminación forzosa de subprocesos. La única forma segura de terminar un hilo es desde adentro. De esta forma, sabes que el hilo no está en el medio de una operación bloqueada. La interrupción debe ser una característica intrínseca de sus funciones; no es algo que puedas disparar desde el exterior. –