首页 > 解决方案 > 我的单例可以被多次调用

问题描述

我已经实现了一个基于 c++ 11 的单例。但是在某些情况下可以多次调用构造函数。

该类将被编译为静态库并被其他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();
}

/// .cpp 文件

Logger::Logger()
{
   ALOGE("OfflineLogger create");
}

Logger::~Logger()
{

}

它应该创建一次,例如:

03-21 01:52:20.785   728  4522 E         : OfflineLogger create

但是我可以看到它已经被创建了不止一次

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

问题:

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

  2. 似乎我的单例在一个 so 范围内工作正常,但是包含我的单例的每个 so lib 都会创建自己的单例,因此我的单例不再是“单例”。问题是否由每个动态链接到 new so 和“静态变量”变成“本地静态”引起?可能吗?如果是这样,如何解决?

标签: androidc++singletonhal

解决方案


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

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

  1. 似乎我的单例在一个 so 范围内可以正常工作,但是包含我的单例的每个 so lib 都会创建自己的单例,因此我的单例不再是“单例”。问题是否由每个动态链接到新的 so 和“静态可验证”变成“本地静态”?可能吗?如果是这样,如何解决

这是正确的结论。

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


推荐阅读