如何在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内存

如何在Parallel.For中释放DLL内存?

我找到解决办法了。

事实上,我的本地DLL是动态链接到msvcrt运行时(/MD选项)。

每次我尝试做FreeLibrary, MSVCRTXXX.dll仍然加载,因为它依赖于其他加载的DLL。这就是为什么所有非托管内存在并行之后被释放。

这篇文章帮助了我很多:为什么从DLL内部分配的内存在FreeLibrary()之后变得无效?

我刚刚用static链接到msvcrt runtime重新编译了我的本地DLL。

现在调用FreeLibrary后内存完全释放:-)