template <typename T, typename Lock>
class Singleton
{
public:
static T * getInstance()
{
if (obj == 0)
{
lock.lock();
if (obj == 0)
{
obj = new T;
}
lock.unlock();
}
return obj;
}
void deleteInstance()
{
delete obj;
obj = 0;
}
private:
volatile static T * obj = 0;
static Lock lock; // some sort of mutex
Singleton();
~Singleton();
Singleton(const Singleton &);
Singleton & operator=(const Singleton &);
};
objは揮発性である必要がありますか?最初のスレッドがTインスタンスを作成し、その前に2番目のスレッドがすでにキャッシュに0でobjをロードしているとすると、最新のプロセッサキャッシュは無効になるか、2番目のスレッドがobjの0値を使用してTを作成する可能性があります2回目?両方のスレッドが異なるコアで実行されていると仮定します。
また、シングルトンデータとして静的Tの代わりに静的T*を使用する際に発生する可能性のある問題を教えてください。