多次加载Dll以允许.Net中的多线程

时间:2010-11-19 12:41:31

标签: .net multithreading loadlibrary

我的.Net程序使用fortran Dll来执行数学函数(Arpack,解决本征模式)。我相信fortran包含静态变量,通常不是线程安全的。此外,它非常复杂,可能需要花费大量精力才能使其保持线程安全。 Dll不是很大(700K)所以我只想加载它多次(比如4或8)以允许线程同时工作。任何人都知道我该怎么做?我听说LoadLibrary在多次调用时总会返回相同的句柄。因此,我认为唯一的解决方案是在磁盘上安装我的Dll的多个副本(Arpack1.dll,Arpack2.dll等)并根据需要加载它们。非常可怕。

有什么想法吗?

尤安

3 个答案:

答案 0 :(得分:2)

加载DLL不是创建线程的方法。 您的两个选择是使用AppDomains或完全独立的进程。

简单的方法可能是简单地使用主/从布置,其中使用库的逻辑都在从属进程中完成。主人开始了他们想要或需要的“奴隶”,然后收集返回值。

将代码写入“slave”,就好像它是单线程一样,因为......它是。

使用master中的System.Diagnostics.Process.Start来启动这些东西。


通常,复制DLL并加载所有副本不是一种故障保护方法; DLL本身可以访问操作系统资源,如互斥锁甚至锁定文件。这些人不会意识到这些副本应该是“分开的”。

如果您的库纯粹是一个计算库,并且您真的想要执行copy-and-load-the-copies方法,则可以创建硬链接以避免重复实际的DLL文件。 (Win7或Vista上的fsutil hardlink create

答案 1 :(得分:2)

您找到的解决方法实际上是相当不错的。使用LOAD_LIBRARY_AS_IMAGE_RESOURCE选项的LoadLibraryEx()可能会有小的可能性。该选项允许您多次加载它。我严重怀疑它,DLL几乎肯定依赖于通过DllMain初始化其运行时支持代码。

我没有听到你提到的一件事是必须使用GetProcAddress()的痛苦。确保你这样做,或者当你开始线程时你仍然会踩踏全局变量。每个线程都必须使用自己的地址。

答案 2 :(得分:0)

如图所示,您无法多次加载库。 我想你有两种可能性:

在两种解决方案中,您都需要考虑进程/应用域之间的数据交换方法。无论如何,这不是一项简单的任务!