0

在嵌套Parallel.For中,我动态加载/卸载不同的 DLL。我注意到在 'child' 的末尾没有释放内存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 之一。/MDDLL 是使用选项编译的 c++ 非托管代码。每个库只被一个线程使用Parallel.For

你能解释一下吗?

如何释放 DLL 内存Parallel.For

4

1 回答 1

2

我找到了解决方案。

事实上,我的原生 DLL 是与 msvcrt 运行时(选项)动态链接的。/MD

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

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

我刚刚使用到 msvcrt 运行时的静态链接重新编译了我的本机 DLL。

现在,在“FreeLibrary”调用之后,内存完全释放了 :-)

于 2014-05-26T13:04:23.547 回答