通常创建单件的代码都是长这样的:
class USingleton
{
public:
static USingleton* Instance()
{
if (Instance == null)
{
Instance = new USingleton();
}
return Instance;
}
private:
USingleton() {}
USingleton* Instance;
}
最近看了《游戏编程模式》中对于单件的描述发现了个更安全的写法:
class USingleton
{
public:
static USingleton& Instance()
{
if (Instance == null)
{
Instance = new USingleton();
}
return *Instance;
}
private:
USingleton() {}
USingleton* Instance;
}
这样返回的是单件类实例的引用而不是指针。 以下是个更现代的版本:
class USingleton
{
public:
static USingleton& Instance()
{
static USingleton Instance;
return Instance;
}
private:
USingleton() {}
}
C++11保证一个局部静态变量的初始化只进行一次,哪怕是在多线程的情况下也是如此。所以,如果你有一个现代C++编译器的话,这份代码是线程安全的。