c++ - 如何制作线程本地库实例?
问题描述
我们在工作场所使用遗留图书馆。它包含一些业务逻辑,它的代码在千年变化之前就已经丢失了。代码包含一些硬金融算法,它积极使用全局变量。
我们计划进行一些并行计算,启动新线程。每个线程都将独立于另一个线程,只是一个返回某个数字的黑盒。
核心问题是库不是线程安全的。我们希望以某种方式使每个线程都有自己的共享库中的全局变量、代码等副本。
这可能吗?目前,我们只是修补符号名称并使用前缀进行复制。
library-thread1.so
,library-thread2.so
等等。
符号是RTLD_DEEPBIND
在 linux 下加载的。
编辑:用进程替换线程是解决这个问题的最严格的方法,但它引起了对性能的担忧。而且似乎工作量很大,而不仅仅是做肮脏的黑客。
解决方案
核心问题是库不是线程安全的。
使用进程,而不是线程。该库将自动实现多进程安全,无需任何努力或意外共享的风险。
我们希望以某种方式使每个线程都有自己的共享库中的全局变量、代码等副本。
具有此属性的线程称为进程。进程——主要是——不共享全局变量的线程(包括文件描述符、std::cout
缓冲区等)。
通常,在 Linux 或 *NIX 上,进程并不比线程更昂贵或通信速度更慢。
用进程替换线程是解决这个问题的最严格的方法,但它引起了对性能的担忧
这样做,然后测量性能。如果确实存在问题,您可以在 Linux 上使用共享内存来保持线程的有效零开销通信,同时保持正确的语义。
而且似乎工作量很大,而不仅仅是做肮脏的黑客。
更多地担心当一切都出错并且你无法弄清楚原因时支持肮脏的黑客需要多少工作。
推荐阅读
- matlab - 如何在 matlab 中初始化具有任意数量变量的方程?
- flutter - 注释会影响何时生成颤振应用程序包?
- javascript - 错误:文件验证失败:内容:需要路径“内容”。标题:需要路径“标题”
- excel - 在 Excel 中绘制具有两个日期的装运数据
- spring-boot - “mvn package”和“mvn compile war:war”之间的区别
- javascript - 如何从 NextJs 中的 getServerSideProps 访问 Redux 状态?
- iis - 从 Windows 身份验证中排除路径
- amazon-web-services - 为什么 AWS ElasticSeacrh Kibana 上缺少状态管理
- javascript - 带有动态参数的 Javascript 去抖回调函数
- python - 在 Python 中,如何丢弃 printf 样式格式字符串中的参数?