c++ - Linux 中的单例与共享模块和静态内存访问
问题描述
我有一个正在启动的进程正在加载到多个共享库中。这些共享库中的一些代码是相同的(例如公共文件)并且使用单例设置。例如
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 ......如果去并且必须在整个地方修改它会非常不方便。谢谢
解决方案
几天后(我知道这个问题只有 30 分钟,但我终于找到了解决方案)......我找到了我在 macOS 上但在 Linux 上没有做的事情。
我在我的通用代码中添加了以下额外的编译标志,一切都像在 macOS 上一样完美到位-fPIC -fvisibility-inlines-hidden -fvisibility=hidden
。
有了这些额外的标志,代码就彼此分离,不再在内存中重叠。
推荐阅读
- amazon-dynamodb - DynamoDB:获取与可能键之一匹配的所有项目
- docker - 在 jenkins pod 中执行 docker 和 kubectl 命令并支持持久卷
- c# - OpenTK (OpenGL) 如何正确使用 BufferSubData 和 DrawElements 与多个对象
- angular - Angular - 使用 jsonPath
- postgresql - PostgreSQL:如何将“PIVOT”从 T-SQL 转换为 PLPGSQL 过程
- java - Mockito.mockConstruction 不返回测试类中的模拟对象
- amazon-web-services - 如何使用 Terraform 将相同的 IAM 角色添加到 assume_role_policy?
- c++ - 当库的其余部分加载正常时,为什么该符号未定义用于架构 x86_64?
- spring - 如何在 JPA 中创建日期规范以查找更大/更少等?
- c++ - 如何为作为基类存储在 std::vector 中的派生类编写重载函数