シングルトンは複数回呼び出すことができます 質問する

シングルトンは複数回呼び出すことができます 質問する

私は C++ 11 に基づいてシングルトンを実装しました。ただし、場合によってはコンストラクターが複数回呼び出されることがあります。

クラスは静的ライブラリにコンパイルされ、他のライブラリ(複数のライブラリ)によって使用されます。システムはマルチスレッドシステムです(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. 私のシングルトンは 1 つの so スコープでは正常に動作しているようですが、私のシングルトンを含む各 so ライブラリは独自のシングルトンを作成するため、私のシングルトンはもはや「シングルトンではない」状態になります。問題は、各動的リンクが新しい so にリンクされ、「静的変数」が「ローカル静的」になることから発生するのでしょうか? それは可能ですか? もし可能であれば、どのように修正しますか?

ベストアンサー1

  1. シングルトン設計に何か問題がありますか? スレッドセーフの問題ですか?

いいえ。関数のローカルstatic変数の初期化は、標準によってスレッドセーフであることが保証されています。

  1. 私のシングルトンは 1 つの so スコープでは正常に動作しているようですが、私のシングルトンを含む各 so ライブラリは独自のシングルトンを作成するため、私のシングルトンはもはや「シングルトンではない」ことになります。問題は、各動的リンクが新しい so にリンクされ、「静的変数」が「ローカル静的」になることから発生するのでしょうか。可能でしょうか。可能であれば、どのように修正すればよいでしょうか。

それは正しい結論です。

シングルトンの実装を含む静的ライブラリを作成する代わりに、動的ライブラリにします。

おすすめ記事