首页 > 解决方案 > 如何制作线程本地库实例?

问题描述

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

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

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

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

library-thread1.solibrary-thread2.so等等。

符号是RTLD_DEEPBIND在 linux 下加载的。

编辑:用进程替换线程是解决这个问题的最严格的方法,但它引起了对性能的担忧。而且似乎工作量很大,而不仅仅是做肮脏的黑客。

标签: c++linuxwindowsshared-libraries

解决方案


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

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

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

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

通常,在 Linux 或 *NIX 上,进程并不比线程更昂贵或通信速度更慢。

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

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

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

更多地担心当一切都出错并且你无法弄清楚原因时支持肮脏的黑客需要多少工作。


推荐阅读