C++ 如何使线程成为本地库实例?

C++ 如何使线程成为本地库实例?,c++,linux,windows,shared-libraries,C++,Linux,Windows,Shared Libraries,我们在工作场所使用遗留库。它包含一些业务逻辑,它的代码在几千年前就丢失了。代码包含一些硬财务算法,它积极使用全局变量 我们计划进行一些并行计算,启动新线程。每个线程都是独立的,只是一个返回一些数字的黑盒 核心问题是库不是线程安全的。我们希望以某种方式使每个线程都有它自己的全局变量副本、共享库中的代码等 这可能吗?目前,我们只修补符号名称并使用前缀进行复制 library-thread1.so,library-thread2.so等 在linux下使用RTLD\u DEEPBIND加载符号 编辑:

我们在工作场所使用遗留库。它包含一些业务逻辑,它的代码在几千年前就丢失了。代码包含一些硬财务算法,它积极使用全局变量

我们计划进行一些并行计算,启动新线程。每个线程都是独立的,只是一个返回一些数字的黑盒

核心问题是库不是线程安全的。我们希望以某种方式使每个线程都有它自己的全局变量副本、共享库中的代码等

这可能吗?目前,我们只修补符号名称并使用前缀进行复制

library-thread1.so
library-thread2.so

在linux下使用
RTLD\u DEEPBIND
加载符号

编辑:用进程替换线程是解决这一问题最困难的方法,但它会引起对性能的担忧。而且似乎要做很多工作,而不仅仅是做肮脏的黑客

核心问题是库不是线程安全的

使用进程,而不是线程。该库将自动实现多进程安全,不会产生意外共享的后果或风险

我们希望以某种方式使每个线程都有它自己的全局变量副本、共享库中的代码等

具有此属性的线程称为进程。进程主要是不共享全局的线程(包括文件描述符、
std::cout
buffers等)

在Linux或*NIX上,进程通常不会比线程更昂贵或更慢

用进程替换线程是解决这个问题的最直接的方法,但它会引起对性能的担忧

这样做,然后测量性能。如果这确实是一个问题,您可以在Linux上使用共享内存来保持线程的有效零开销通信,同时保留正确的语义

而且似乎要做很多工作,而不仅仅是做肮脏的黑客


更为担心的是,当肮脏的黑客程序出了问题,你无法找出原因时,要支持它需要做多少工作。

如果你用“进程”代替“线程”,这当然是可能的。在以前的工作中,我们遇到了一个类似的问题,即需要一个进程来加载负责与服务总线进行网络通信的库的不同版本。这对于允许一个服务与运行wire协议不兼容版本的多个总线通信是必要的。我们的解决方案是构建一个COM服务并创建进程外实例。您可以做同样的事情:创建进程外COM服务并创建多个实例。当然会有一些IPC开销,但这在您的用例中可能并不重要。全局变量是进程全局变量,因此线程不足以隔离它们。考虑在并行化工作时产生多个单独的进程。这当然不能回答我的问题。那么,你的问题预先假设了线程和进程之间以及进程间和线程间通信的性能之间的一个难以区分的问题。这种假设是错误的,因此框架挑战似乎是一种合理的反应。如果你对进程有一个真实的问题,而不是想象中的问题,或者你需要了解如何使用它们的帮助,那么就提出这个问题。顺便说一句,我完全不知道如何在Windows上解决这个问题。无论如何,试图将两个完全不同的流程模型合并为一个答案似乎有些过分,但我不知道最好的解决方案可能在两个平台上都是相同的。