在嵌套的Parallel.For
中,我动态加载/卸载不同的DLL。
我注意到“孩子”Parallel.For
结束时没有释放内存。 'root'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 ++非托管代码。
每个lib仅由Parallel.For
你能解释一下吗?
如何在Parallel.For
?
答案 0 :(得分:2)
我找到了解决方案。
实际上,我的本机DLL是动态地链接到msvcrt运行时(/MD
选项)。
每次我尝试FreeLibrary
时,MSVCRTXXX.dll
仍会被加载,因为它取决于其他加载的DLL。
这就是为什么在Parallel.For
这篇文章给了我很多帮助:Why does memory allocated from inside a DLL become invalid after FreeLibrary()?
我刚刚用msvcrt运行时的 static 链接重新编译了我的原生DLL。
现在,在FreeLibrary'之后,记忆完全被重新发布。致电: - )