【问题标题】:Link multiple instances of same shared library into JVM将同一共享库的多个实例链接到 JVM
【发布时间】:2011-05-31 14:58:22
【问题描述】:

目标是为非线程安全的 .so 模拟多线程行为。内存充足,不是问题。对我来说重要的是通过 JNI 进行向下调用。不重要的是向上调用和在 .so 实例之间共享任何内容(目标是完全隔离)。

我听说可以多次链接共享库,但我没有看到有人真正这样做。

有一个opinion 说这样做是个坏主意,但我不相信这个论点。

这是一个好主意还是坏主意,为什么?

如果这在某些条件下证明是一个好主意,我可以在哪里阅读更多关于它的信息?任何人都可以分享一些这样做的代码吗?

让我补充一点,使 .so 线程安全并不是一个真正的选择,而互斥锁是我正在努力改进的当前实现。

【问题讨论】:

    标签: multithreading jvm java-native-interface shared-libraries


    【解决方案1】:

    共享库的想法只是在多个应用程序之间共享一个公共代码段。

    一旦您意识到这个基本事实,您就会意识到您尝试做的事情是没有意义的。因为内存分配将在您的进程空间内。

    【讨论】:

    • 我明白我想要做的是反对共享库的想法。这不是问题的重点。关键是要欺骗 JVM 多次链接相同的 .so (通过 LD_LIBRARY_PATH 操作或其他 - 没关系)。说“没有意义”——你的意思是这是不可能的吗?或者你的意思是它对没有意义,你会以不同的方式做?
    • 我想说的是,即使您设法做到这一点,变量将在哪里分配内存?假设它不是一个线程安全的库,所以它不是完全可重入的;说存在静态变量。你认为如果你多次链接库,同一个静态变量会有多个内存分配?对我来说听起来像是一个交易破坏者!
    • 同意静态变量,确实是交易破坏者。使用不同的命名空间使它们成为命名空间静态的,而不是进程静态的呢?我只是在抛出想法,而不是我知道实现这一目标的方法。我开始这个帖子的原因是因为我认为我听说过这样做了。
    • 你让它们命名空间静态(你实际上是让库可重入)并且你的共享库变得线程安全。我假设你没有库的代码,或者你不想碰它。
    • 我确实有库源代码,但我不敢碰它,怕破坏它。如果我能以最小的、易于理解的方式触摸它,那是可以接受的。我真的很想和做过这件事的人谈谈,否则我可能会诉诸试验和错误:用几个静态变量创建模拟库,并找出最小量的代码修改将实现静态变量的分离。顺便说一句,感谢您的讨论。
    猜你喜欢
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多