如何制作线程本地库实例

How to make thread-local library instance?

本文关键字:实例 何制作 线程      更新时间:2023-10-16

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

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

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

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

library-thread1.solibrary-thread2.so

符号是在linux下使用RTLD_DEEPBIND加载的。

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

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

使用进程,而不是线程。该库将自动实现多进程安全,无需任何努力或意外共享的风险。

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

具有此属性的线程称为进程。进程大多是不共享全局(包括文件描述符、std::cout缓冲区等(的线程

在Linux或*NIX上,进程通常不会比线程昂贵得多,或者通信速度慢得多。

用进程替换线程是解决这一问题的最简单方法,但它引发了对性能的担忧

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

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

更担心的是,当一切都出错时,支持肮脏的黑客需要做多少工作,你不知道为什么。