マルチスレッド環境でシングルトン クラスを作成していますが、どのスレッドでもシングルトン オブジェクトを削除できます。これを守りたい。この問題を回避するために、デストラクタを非公開にし、destroy メソッドを提供できることをどこかで読みました..どうすればこれを行うことができますか? サンプルコードが役立ちます..
前もって感謝します。
マルチスレッド環境でシングルトン クラスを作成していますが、どのスレッドでもシングルトン オブジェクトを削除できます。これを守りたい。この問題を回避するために、デストラクタを非公開にし、destroy メソッドを提供できることをどこかで読みました..どうすればこれを行うことができますか? サンプルコードが役立ちます..
前もって感謝します。
class Singleton; // forward declaration
Singleton * s = NULL; // global object available to all threads
// Place this class in a location unavailable to all threads except Main thread
class ManageSingleton
{
public:
static void DestroySingleton(Singleton * s)
{
delete s;
}
}
class Singleton
{
friend class ManageSingleton;
protected:
~Singleton() {}
};
void main()
{
s = new Singleton;
while (...)
{
// other threads access Singleton object until program is finished
}
// Program is now finished; destroy Singleton object
ManageSingleton::DestroySingleton(s);
}
特に純粋なシングルトンが必要な場合、スレッド化はこの設計に対して実際に機能します。次のように視覚化できます。
class t_singleton {
public:
static t_singleton& Get() {
/* thread safety is a consideration here: */
t_auto_ptr<t_singleton>& shared(Shared());
if (shared.isNull()) {
shared.setObject(new t_singleton);
}
/* and you should manage external references using another container type: */
return Shared().reference();
}
static void DestroyIt() {
/* thread safety is a consideration here: */
Shared().destroy();
}
private:
static t_auto_ptr<t_singleton>& Shared() {
static t_auto_ptr<t_singleton> s_Shared;
return s_Shared;
}
private:
t_singleton();
~t_singleton();
};
ただし、これは、純粋なシングルトンを使用した多くのスレッドの危険信号も示唆しているはずです。
これを本当に拡張して純粋なシングルトンを強制したい場合は、適切な参照カウント コンテナーが必要になります。これは、シングルトンがこの問題の複数の点で不適切な解決策であることを示唆しており、不要な複雑さを大量に追加するだけです。幸運を!
デストラクタをプライベートにし、シングルトンのすべてのメモリを破壊およびクリーンアップする責任があるデストラクタクラスを提供します。シングルトンクラスの友達である必要があります。それに加えて、あなたは絶対にシングルトンが必要ですか?それとも、これは別の使いすぎのシナリオですか?