his*_*art 30 c++ singleton android hal
我已经基于c ++ 11实现了单例。但是在某些情况下,可以多次调用构造函数。
该类将编译为静态lib,并由其他so lib(一个以上so lib)使用。并且该系统是多线程系统(在Android HAL级别运行)
/// .h文件:
class Logger
{
public:
/// Return the singleton instance of Logger
static Logger& GetInstance() {
static Logger s_loggerSingleton;
return s_loggerSingleton;
}
private:
/// Constructor
Logger();
/// Destructor
~Logger();
}
Run Code Online (Sandbox Code Playgroud)
/// .cpp文件
Logger::Logger()
{
ALOGE("OfflineLogger create");
}
Logger::~Logger()
{
}
Run Code Online (Sandbox Code Playgroud)
应该创建一次,例如:
03-21 01:52:20.785 728 4522 E : OfflineLogger create
Run Code Online (Sandbox Code Playgroud)
但是我可以看到它已经创建了不止一次
03-21 01:52:20.785 728 4522 E : OfflineLogger create
03-21 01:52:20.863 728 2274 E : OfflineLogger create
03-21 01:52:20.977 728 2273 E : OfflineLogger create
03-21 01:52:26.370 728 4522 E : OfflineLogger create
Run Code Online (Sandbox Code Playgroud)
问题:
我的单例设计有什么问题吗?这是线程安全的问题吗?
似乎我的单身人士在一个so范围内工作良好,但是包括我的单身人士的每个so lib都将创建自己的单身人士,因此我的单身人士不再是“单身人士”。是由于每个动态链接都与new关联而导致的问题,并且“静态变量”变为“局部静态”?可能吗?如果是这样,如何解决?
R S*_*ahu 28
- 我的单例设计有什么问题吗?这是线程安全的问题吗?
static不能。标准保证函数局部变量的初始化是线程安全的。
- 似乎我的单身人士在一个这样的范围内运行良好,但是包括我的单身人士的每个so lib都将创建自己的单身人士,因此我的单身人士不再是“单身人士”。是由于每次动态链接到新的so导致的问题,“ staic veriable”变成“ local static”吗?可能吗?如果是这样,如何解决
那是正确的结论。
与其创建包含单例实现的静态库,不如使其成为动态库。