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 是否必须是 volatile 的?如果第一个线程创建 T 实例并假设第二个线程在此之前已经在缓存中加载了 0 的 obj,那么现代处理器缓存是否会失效,或者第二个线程可能会使用 obj 的 0 值并创建 T第二次?假设两个线程都在不同的内核中运行。
另外,请让我知道使用静态 T * 而不是静态 T 作为单例数据可能出现的任何问题。