如何在Parallel.For中释放DLL内存?
本文关键字:释放 DLL 内存 For Parallel | 更新日期: 2023-09-27 18:04:22
在嵌套的Parallel.For
中,我动态加载/卸载不同的DLL。我注意到内存在'子' Parallel.For
的末尾没有被释放。内存似乎在 '根' Parallel.For
之后被释放。
Parallel.For(0, 100, j =>
{
// Do stuffs
Parallel.For(0, maxIter, i =>
{
// Dynamically load DLL file
NativeMethods.LoadLibrary(...)
// Do stuffs with the DLL
... (call compute method)
// Dynamically unload DLL file
NativeMethods.FreeLibrary(...)
});
// Do stuffs
}
// Do stuffs (DLL Memory seems to be release only here, not before)
我已经克隆了一个DLL在许多DLL不同的名称(复制文件和重命名它)。每个NativeMethods.LoadLibrary(...)
加载其中一个DLL。DLL是用/MD
选项编译的c++非托管代码。每个库只能由Parallel.For
你能解释一下吗?
如何在Parallel.For
中释放DLL内存
我找到解决办法了。
事实上,我的本地DLL是动态链接到msvcrt运行时(/MD
选项)。
每次我尝试做FreeLibrary
, MSVCRTXXX.dll
仍然加载,因为它依赖于其他加载的DLL。这就是为什么所有非托管内存在并行之后被释放。
这篇文章帮助了我很多:为什么从DLL内部分配的内存在FreeLibrary()之后变得无效?
我刚刚用static链接到msvcrt runtime重新编译了我的本地DLL。
现在调用FreeLibrary后内存完全释放:-)