[英]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.