如何在多线程环境中使用旧的单线程C ++库

时间:2011-02-17 10:50:23

标签: c++ windows multithreading legacy-code

我有一个旧的C ++库,专为在单线程环境中使用而设计。

库公开了用于初始化的接口,它改变了库的内部数据结构和用法,它只读取数据并进行计算。

我的目标是在Windows多线程应用程序中使用此库,其中不同的线程调用使用不同数据初始化的dll实例。

假设重写dll以允许多线程将是禁止的,是否有某种方法让DLL的多个实例存在于同一进程中,具有单独的内存空间,或通过其他方式获得类似的结果?

2 个答案:

答案 0 :(得分:6)

如果DLL包含静态资源,那么这些资源将在创建的所有实例之间共享。

一种可能的方法是创建单个实例并使用某种锁机制限制对它的访问。这可能会降低性能,具体取决于使用情况,但如果不修改DLL的内部结构,可能很难使用多个实例。

答案 1 :(得分:5)

在进程中连接到单个DLL的所有线程之间共享静态资源会在这里与您发生冲突。

然而,有一个技巧可以实现这一目标。只要DLL具有不同的名称,系统就会将它们视为不同,因此会创建单独的代码和数据实例。

实现此目的的方法是,对于每个线程,将DLL复制到临时文件并使用LoadLibrary从那里加载。你必须使用显式链接(GetProcAddress)而不是lib文件,但这实际上是唯一的方法。