加载共享库的多个副本

我正在运行Linux,我希望能够并行函数调用到一个共享库(.so),这不幸是不是线程安全(我猜它有全局数据结构)。

出于性能的原因,我不想简单地将函数调用包装在一个互斥量中。

我想要做的就是产生4个线程,并将同一个库的4个副本加载到进程内存中。 然后每个线程将函数调用放到它自己的库副本中。

不幸的是,dlopen不允许我加载任何库的更多的实例。

有谁知道任何方法,将允许我不止一次地加载图书馆? (除了制作4个.so文件的副本,每个都有不同的名称)

Solutions Collecting From Web of "加载共享库的多个副本"

可以像这样加载多个独立的库副本:

#define _GNU_SOURCE #include <dlfcn.h> ... void *handle = dlmopen(LM_ID_NEWLM, "/path/to/library.so", RTLD_NOW); 

更多信息在这里 。

你可以使用多个进程来完成一些工作,而不是使用线程。 这在* nix上是很常见的,通常更容易编码。

看起来不好主意。 这对于共享库来说是不可能的,因为它是静态的。

你可以使用dlopen()和RTLD_LOCAL标志,这样后续的dlopen调用就不会看到它已经被加载完毕,并且可以按照你的要求工作,但是看起来它仍然是一个糟糕的设计理念。 如果您遇到性能问题,最好避免使用同一个库的多个副本来混淆内存。

我会建议使用多个进程或采用互斥方式,这可能会更有效率。

当你在Linux上工作的时候,如果你可以访问库的源代码,就可能存在其他的方法,比如重命名它的符号,以便根据需要拥有尽可能多的独立实例……好吧,一旦你获得了源代码,就像使库的线程安全一样。

它是什么库? 这个东西大吗? 我想知道如果你不能以某种方式修复这个库是线程安全的,那么使用库的线程安全版本来构建你的代码。 这取决于图书馆的规模,以及它有什么问题,但是如果你能修好图书馆,你就可以按你想要的方式建立你的应用程序,并帮助其他人。