【问题标题】:Creating an object in shared memory inside a Shared Lib (so) in C++在 C++ 中的 Shared Lib (so) 内的共享内存中创建一个对象
【发布时间】:2008-11-11 15:05:16
【问题描述】:

是否可以在链接到此代码的每个人之间共享一个“上帝”实例,以放置在共享对象中?

god* _god = NULL;
extern "C" 
{

int set_log_level(int level)
{
    if(_god == NULL) return -1;
    _stb->log_level(level);
    return 0;
}

int god_init(){
    if(_god == NULL){
        _god = new god(); //Magic happens here
    }
}

}

假设我在每个函数的开头都进行了锁同步,并且考虑到上帝本身可以 new/malloc 其他东西,但是那些东西永远不会自己返回给调用者(上帝 malloc 仅供内部使用),什么如果可能的话,这是最简单的方法。

如何将其扩展到链接到此共享库的任意数量的程序?

【问题讨论】:

  • 这通常被称为单例。
  • 不——他希望在所有链接的进程之间共享一个实例。

标签: c++ memory shared-libraries


【解决方案1】:

Boost Interprocess 库具有更高级别的可移植共享内存对象。

【讨论】:

    【解决方案2】:

    这根本不是正确的方法。通过按照您的建议进行操作,是的,变量对于库是全局的,因此对于程序来说是全局的,但数据对于实际运行的进程是私有的。您将无法在正在运行的程序之间共享这些值。 @grieve 是指多个线程访问的全局,但线程共享同一个父进程实例。

    在实际进程中,您需要突破到特定于操作系统的共享内存设施。 详情请查看Shared Memory。这是一个可行的问题,但实现起来并不是特别简单。您还需要像信号量这样的进程间同步系统来协调使用。

    【讨论】:

    • 除了使用 RPC 之外,没有其他方法可以解决此特定问题,但这在我正在开发的应用程序中导致了严重的性能问题。还要记住,我不拥有/控制所有需要链接的代码,所以我不能修改它。
    • 共享内存不是 RPC。 RPC 是一个数据序列化的远程过程调用,共享内存就是进程之间共享的内存。除任何同步问题外,这是“全速”本机内存。
    • 威尔,你为什么说“数据是..进程私有的”? Edu 说他将所有数据都放在共享内存段中。 “上帝”及其创建的所有对象都将位于共享内存中,使用自定义运算符 new() 或他正在使用的任何其他内存分配系统。
    • 不,他说他正在将数据放入共享对象中。他希望在单个文件中定义一个对象,并仅通过使用链接器使该对象在进程之间“神奇地共享”。链接器不能也不会这样做。任何库中的任何“全局”数据,甚至是“共享”库,都是进程本地的。您必须使用一些基于操作系统的进程外工具(例如共享内存)来实现他想要的,而这不会“免费”提供(尽管,显然,Boost 库具有更容易实现这一点的实用程序过程)。
    【解决方案3】:

    我感觉上帝将成为某种服务器。考虑使用适当的客户端/服务器架构,以便让上帝远离大众。

    【讨论】:

      猜你喜欢
      • 2017-03-02
      • 1970-01-01
      • 2019-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      相关资源
      最近更新 更多