多个共享对象实例和每个实例的并行执行

时间:2018-03-31 12:09:29

标签: pthreads shared-libraries dlopen

我有共享对象 sw_core.so 。我需要有这个" .so"的多个实例(单独的内存分配)。在主程序中。在主程序中,我将调用 sw_core.so 中定义的findViewById函数。所有display_context()都需要并行运行。 sw_core.so 是线程安全的(根据我的知识没有内存依赖)。

要解决上述问题,

  1. display_context()用于调用带有dlopen sw_core.so ,以拥有" .so"。
  2. 的多个实例
  3. RTLD_LAZY用于通过pthread
  4. 获取符号来调用display_context()
  5. 尝试的线程数为2
  6. 任何高于2的结果都会导致段错误。
  7. 当我调用2个线程时,第二个线程写dlsym()时会发生segfault。
  8. 尝试使用valgrind工具检查内存泄漏,但未显示任何严重泄漏。

4 个答案:

答案 0 :(得分:0)

通过多次加载相同的库,目前尚不清楚您要做什么。共享库的数据段,每个进程在一个副本中创建一次,并由库中指定的任何初始值初始化。

如果调用使用存储在库中的某些数据或状态,最好在这种情况下覆盖它。

答案 1 :(得分:0)

注意:我在Synopsys工作。如果您和Priyan一样好,您可以在内部与我联系。

接下来,Valgrind的观点 内存泄漏可能不是问题。我建议您先确保没有memcheck个问题。 memcheck是单线程的,因此问题不应与线程相关。之后,您可以使用DRD或Helgrind来检测线程问题。

最后,我认为您无法打开共享库的多个不同实例。手册页(here)说

  

如果使用dlopen()再次加载相同的共享对象,则相同   返回对象句柄。动态链接器维护引用   计算对象句柄,因此动态加载的共享对象是   在多次调用dlclose()之前不会释放   因为dlopen()成功了。任何初始化返回(参见   以下)只被召唤一次。但是,后续的dlopen()调用   使用RTLD_NOW加载相同的共享对象可能会强制符号   先前使用RTLD_LAZY加载的共享对象的解析。

答案 2 :(得分:0)

Dlopen概率不起作用,因为它会导致sw_core.so的不同版本之间错误共享公共符号。要实现正确的隔离,请使用dlmopen

void *h = dlmopen (LM_ID_NEWLM, "path/to/sw_core.so", RTLD_LAZY | RTLD_LOCAL);

答案 3 :(得分:0)

非常感谢您的帮助!我可以多次成功加载单个库,每个库都使用dlmopen()在单独的命名空间中。只有我遇到的问题是gcc不支持dlmopen()。我检查到4.9版本,但没有成功。使用g ++,在加载时没有出现任何问题。

所有静态,全局,静态全局变量都为加载的库的每个实例都有自己的内存。

注意: - 我正在使用我自己的lib(dlmopen的参数)进行此实验而不是任何标准库。

  • 普里亚恩