我有一个旧的C ++库,专为在单线程环境中使用而设计。
库公开了用于初始化的接口,它改变了库的内部数据结构和用法,它只读取数据并进行计算。
我的目标是在Windows多线程应用程序中使用此库,其中不同的线程调用使用不同数据初始化的dll实例。
假设重写dll以允许多线程将是禁止的,是否有某种方法让DLL的多个实例存在于同一进程中,具有单独的内存空间,或通过其他方式获得类似的结果?
答案 0 :(得分:6)
如果DLL包含静态资源,那么这些资源将在创建的所有实例之间共享。
一种可能的方法是创建单个实例并使用某种锁机制限制对它的访问。这可能会降低性能,具体取决于使用情况,但如果不修改DLL的内部结构,可能很难使用多个实例。
答案 1 :(得分:5)
在进程中连接到单个DLL的所有线程之间共享静态资源会在这里与您发生冲突。
然而,有一个技巧可以实现这一目标。只要DLL具有不同的名称,系统就会将它们视为不同,因此会创建单独的代码和数据实例。
实现此目的的方法是,对于每个线程,将DLL复制到临时文件并使用LoadLibrary
从那里加载。你必须使用显式链接(GetProcAddress
)而不是lib文件,但这实际上是唯一的方法。