私は 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 つの so スコープでは正常に動作しているようですが、私のシングルトンを含む各 so ライブラリは独自のシングルトンを作成するため、私のシングルトンはもはや「シングルトンではない」状態になります。問題は、各動的リンクが新しい so にリンクされ、「静的変数」が「ローカル静的」になることから発生するのでしょうか? それは可能ですか? もし可能であれば、どのように修正しますか?
ベストアンサー1
- シングルトン設計に何か問題がありますか? スレッドセーフの問題ですか?
いいえ。関数のローカルstatic
変数の初期化は、標準によってスレッドセーフであることが保証されています。
- 私のシングルトンは 1 つの so スコープでは正常に動作しているようですが、私のシングルトンを含む各 so ライブラリは独自のシングルトンを作成するため、私のシングルトンはもはや「シングルトンではない」ことになります。問題は、各動的リンクが新しい so にリンクされ、「静的変数」が「ローカル静的」になることから発生するのでしょうか。可能でしょうか。可能であれば、どのように修正すればよいでしょうか。
それは正しい結論です。
シングルトンの実装を含む静的ライブラリを作成する代わりに、動的ライブラリにします。