【发布时间】:2011-01-07 00:03:03
【问题描述】:
我有一个 .NET/native C++ 应用程序。目前,C++ 代码在默认堆上分配内存,该堆在应用程序的整个生命周期内都存在。基本上,函数/命令在 C++ 中执行,这会导致当前持久内存的分配/修改。我正在研究一种在执行过程中取消其中一个功能/命令的方法。我们有数百个这样的命令,其中许多是非常复杂的(遗留)代码。
我试图避免的蛮力方法是修改每个命令/函数以检查取消并进行所有适当的清理(释放堆内存)。我正在研究一种多线程方法,其中一个附加线程接收取消请求并终止命令执行线程。我希望使用HeapCreate()(Win32)在“私有堆”上分配所有动态内存。这样,处理取消请求的线程可以破坏私有堆。但是,如果命令运行完成,我需要动态内存来保持。在这种情况下,我想在逻辑上相当于将私有堆内存“移动”到默认/进程堆,而不会产生实际副本的成本。这有可能吗?这有意义吗?
另外,我认识到我可以为每个命令/函数执行创建一个新的私有堆(每个都将是一个新线程)。如果命令被取消,私有堆可能会被破坏,或者如果命令完成,它将继续存在。 number 堆无限增长有什么问题吗?我知道每个堆都涉及一些开销。我可能会遇到什么限制?
我在 8GB RAM 的 64 位 Windows 7 上运行(将此视为目标平台)。我正在使用的应用程序大约有 100 万个 SLOC(一半 C++,一半 C#)。我正在寻找有关私有堆管理的任何经验/建议,或者只是我的解决方案的替代方案。
【问题讨论】:
-
您是在问,您在一个堆中分配的内存是否可以在不实际复制数据的情况下“重新分配”到另一个堆?
-
我有 92% 的把握答案是否定的。但不足以将其发布为答案。
-
堆内存分配并不是强制终止线程的唯一问题。终止线程的唯一安全方法是从内部。这样,您就知道线程不在某个锁定操作的中间。可中断性需要成为函数的内在特征;这不是你可以从外面固定的东西。
标签: c++ windows winapi memory-management heap-memory