我的单身人士可以被多次叫

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)

问题:

  1. 我的单例设计有什么问题吗?这是线程安全的问题吗?

  2. 似乎我的单身人士在一个so范围内工作良好,但是包括我的单身人士的每个so lib都将创建自己的单身人士,因此我的单身人士不再是“单身人士”。是由于每个动态链接都与new关联而导致的问题,并且“静态变量”变为“局部静态”?可能吗?如果是这样,如何解决?

R S*_*ahu 28

  1. 我的单例设计有什么问题吗?这是线程安全的问题吗?

static不能。标准保证函数局部变量的初始化是线程安全的。

  1. 似乎我的单身人士在一个这样的范围内运行良好,但是包括我的单身人士的每个so lib都将创建自己的单身人士,因此我的单身人士不再是“单身人士”。是由于每次动态链接到新的so导致的问题,“ staic veriable”变成“ local static”吗?可能吗?如果是这样,如何解决

那是正确的结论。

与其创建包含单例实现的静态库,不如使其成为动态库。