簡體   English   中英

Linux 中的 Singleton 與共享模塊和 Static Z4789F23283B3A61F858B641A1BEF1 訪問

[英]Singleton in Linux with Shared Modules and Static Memory Access

我有一個正在啟動的進程正在加載到多個共享庫中。 這些共享庫中的一些代碼是相同的(例如公共文件),並且使用的是 singleton 設置。 例如

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

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

我現在遇到了一個問題,這個MySingleton class 只被初始化一次並在 memory 中的模塊之間共享(因為它們被加載到同一個進程中)。 這似乎是 Linux 特定問題,因為我在 Mac OS 或 Windows 上沒有遇到此問題,應用程序運行良好。

為了進一步強調/澄清問題,例如,我有以下代碼:

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

我的問題如下:有沒有辦法強制 Linux/共享模塊擁有獨立的 static memory 池? 還是我受 Linux 操作系統的擺布以及它如何決定實現這一點?

在我的情況下,我在我的日志系統代碼中使用這個 Singleton ......這對 go 來說非常不方便,並且必須在整個地方進行修改。 謝謝

幾天后(我知道這個問題只有 30 分鍾,但我終於找到了解決方案)......我發現了我在 macOS 上缺少的東西,但在 Linux 上卻沒有。

我在我的通用代碼中添加了以下額外的編譯標志,一切都像在 macOS -fPIC -fvisibility-inlines-hidden -fvisibility=hidden上一樣完美到位。

有了這些額外的標志,代碼就會彼此分離,並且在 memory 中不再重疊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM