如何制作线程本地库实例
How to make thread-local library instance?
我们在工作场所使用遗留库。它包含一些业务逻辑,它的代码在几千年的变化之前就丢失了。代码包含一些硬金融算法,它积极使用全局变量。
我们计划进行一些并行计算,启动新的线程。每个线程都将独立于另一个线程,只是一个返回一些数字的黑盒。
核心问题是库不是线程安全的。我们希望以某种方式使每个线程都拥有共享库中全局变量、代码等的自己的副本。
这可能吗?目前,我们只是修补符号名称并使用前缀进行复制。
library-thread1.so
、library-thread2.so
等
符号是在linux下使用RTLD_DEEPBIND
加载的。
EDIT:用进程替换线程是解决这一问题的最简单方法,但它会引发对性能的担忧。而且似乎要做很多工作,而不仅仅是做肮脏的黑客。
核心问题是库不是线程安全的。
使用进程,而不是线程。该库将自动实现多进程安全,无需任何努力或意外共享的风险。
我们希望以某种方式使每个线程都拥有共享库中全局变量、代码等的自己的副本。
具有此属性的线程称为进程。进程大多是不共享全局(包括文件描述符、std::cout
缓冲区等(的线程
在Linux或*NIX上,进程通常不会比线程昂贵得多,或者通信速度慢得多。
用进程替换线程是解决这一问题的最简单方法,但它引发了对性能的担忧
所以这样做,然后测量性能。如果这真的是一个问题,您可以在Linux上使用共享内存来保持线程的有效零开销通信,同时保持正确的语义。
而且似乎要做很多工作,而不仅仅是做肮脏的黑客。
更担心的是,当一切都出错时,支持肮脏的黑客需要做多少工作,你不知道为什么。
相关文章:
- 从C++实例化QML
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 如何在c++17中制作一个模板包装器/装饰器
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- 如何制作一个将函数作为参数的类方法
- 如何从unique_ptr制作static_cast
- 如何为包含另一个类实例的数组制作常量 getter?
- 如何制作线程本地库实例
- 制作不同子类实例的向量
- 制作 boost:::fusion::result_of::as_set<> 的实例不调用其元素的构造函数