【问题标题】:Singleton in Linux with Shared Modules and Static Memory AccessLinux 中的单例与共享模块和静态内存访问
【发布时间】:2021-03-13 06:08:01
【问题描述】:

我有一个正在启动的进程正在加载到多个共享库中。这些共享库中的一些代码是相同的(例如公共文件)并且使用单例设置。例如

class MySingleton
{
  public:
    static MySingleton& GetInstance()
    {
      static MySingleton singleton;
      return singleton;
    }

    // ...
  private:
    // ...
}

我现在遇到了一个问题,这个MySingleton 类只被初始化一次并在内存中的模块之间共享(因为它们被加载到同一个进程中)。这似乎是 Linux 特有的问题,因为我在 Mac OS 或应用程序运行正常的 Windows 上对此没有任何问题。

为了进一步强调/澄清问题,我有以下代码:

// module 1
MySingleton::GetInstance().DoSomething(); // GetInstance() returns 0xABCDEFF
// module 2
MySingleton::GetInstance().DoSomethingElse(); // GetInstance() also returns 0xABCDEFF

我的问题如下:有没有办法强制 Linux/共享模块拥有独立的静态内存池?还是我受制于 Linux 操作系统以及它如何决定实现这一点?

在我的例子中,我在我的日志系统代码中使用了这个 Singleton……如果去并且必须到处修改它会非常不方便。谢谢

【问题讨论】:

    标签: c++ linux memory


    【解决方案1】:

    几天后(我知道这个问题只有 30 分钟,但我终于找到了解决方案)...我找到了我在 macOS 上而不是在 Linux 上缺少和做的事情。

    我在我的通用代码中添加了以下额外的编译标志,一切都像在 macOS -fPIC -fvisibility-inlines-hidden -fvisibility=hidden 上一样完美到位。

    有了这些额外的标志,代码就彼此分离,不再在内存中重叠。

    【讨论】:

      猜你喜欢
      • 2013-10-30
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 2012-10-31
      • 2019-03-04
      • 2014-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多