我正在运行Linux,我希望能够将并行函数调用到共享库(.so)中,遗憾的是它不是线程安全的(我猜它有全局数据结构)。
出于性能原因,我不想简单地将函数调用包装在互斥锁中。
我想做的是产生4个线程,并将同一个库的4个副本加载到进程内存中。然后每个线程将函数调用到它自己的库副本中。
不幸的是,dlopen不允许我加载任何库的更多一个实例。
有没有人知道任何允许我多次加载库的方法? (除了制作4个.so文件的副本,每个都有不同的名称)
答案 0 :(得分:8)
你可以加载库的多个独立副本,如下所示:
#define _GNU_SOURCE
#include <dlfcn.h>
...
void *handle = dlmopen(LM_ID_NEWLM, "/path/to/library.so", RTLD_NOW);
更多信息here。
答案 1 :(得分:6)
您可以使用多个进程,而不是使用线程,每个进程都执行一些工作。这在* nix上很常见,通常更容易编码。
答案 2 :(得分:1)
看起来不错。对于共享库而言,这是不可能的,因为它与静态库一样。
你可能会使用带有RTLD_LOCAL标志的dlopen(),这样后续调用dlopen就不会看到它已经全部加载并让它按你想要的那样工作......但它看起来仍然是一个糟糕的设计理念。如果遇到性能问题,最好避免使用同一个库的多个副本来混乱内存。
我建议使用多个进程或者使用互斥方式,它可能更有效。
当您在Linux上工作时,如果您可以访问库的源代码,也可能存在其他方法,例如将其符号重命名为具有所需数量的单独实例......好吧,一旦获得源,可能会有其他方式,比如使图书馆线程安全。
答案 3 :(得分:0)
它是什么图书馆?这是大事吗?我想知道你是否无法以某种方式将库修复为线程安全,然后使用该库的线程安全版本来构建代码。这取决于库的大小,以及它的错误,但是如果你可以修复库,你就可以按照自己的方式构建应用程序,并帮助其他人。