繁体   English   中英

如何制作线程本地库实例?

[英]How to make thread-local library instance?

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

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

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

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

library-thread1.solibrary-thread2.so等。

使用RTLD_DEEPBIND下的 RTLD_DEEPBIND 加载符号。

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM