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



我已经共享对象 sw_core.so 。我需要在主程序中具有此" .so"的多个实例(单独的内存异常(。从主程序中,我将调用 sw_core.so.so display_context()函数。所有display_context()都需要并行运行。 sw_core.so 是线程安全的(我的知识没有内存依赖性(。

解决上述问题,

  1. dlopen用于用 RTLD_LAZY调用 sw_core.so ,具有多个实例" .so"。
  2. pthread用于通过从dlsym()获取符号
  3. 来调用display_context()
  4. 尝试的线程数为2
  5. 上面2上以上的任何东西都导致segfault。
  6. 当我调用2个线程时,第二个线程编写pthread_join()时,Segfault即将出现。
  7. 尝试了Valgrind工具来检查内存泄漏,但没有显示出任何严重的泄漏。

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

如果通话使用库中存储的一些数据或状态,则最多可以覆盖。

注意:我在Synopsys工作。如果您也这样做也可能要在内部与我联系。

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

最后,我认为您无法打开共享库的多个不同实例。男人页面(这里(说

如果再次使用dlopen((再次加载相同的共享对象,则相同 返回对象句柄。动态链接器保持参考 计算对象句柄,因此动态加载的共享对象是 直到DLClose((被调用多次,直到dlclose(( 正如Dlopen((成功的那样。任何初始化返回(请参阅 下面只称一次。但是,随后的dlopen((调用 加载相同共享对象的rtld_now可能会强制符号 以rtld_lazy加载的共享对象的共享对象的分辨率。

Dlopen明显不起作用,因为它会导致sw_core.so不同版本之间的公共符号的错误共享。要获得适当的隔离使用dlmopen:

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

非常感谢您的所有帮助!我可以多次成功加载单个库,每个库中的每个库都用DLMopen((在单独的名称空间中。我遇到的唯一问题是GCC不支持DLMOPEN((。我检查了到4.9版,但没有成功。对于G ,加载中没有任何问题。

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

注意: - 我正在使用自己的lib(与DLMOPEN的论点(进行此实验。

  • Priyan

最新更新