我在尝试创建单例时想出了这个。示例:(我正在尝试制作MySelf
一个线程安全且不使用双重检查锁定的单例)
class MySelf
{
private:
string Name;
int Age;
MySelf()
{
Name = "Deamonpog";
Age = 24;
cout << "Constructing MySelf : " << Name << endl;
};
friend class MySingleton;
public:
~MySelf(){ cout << "Destructing MySelf : " << Name << endl; };
int MyAge() const
{
return Age;
}
};
class MySingleton
{
private:
static MySelf mself;
public:
static MySelf * GetInstance()
{
return &mself;
}
};
MySelf MySingleton::mself;
现在我可以轻松地使用它,
cout << "I am " << MySingleton::GetInstance()->MyAge() << endl;
我不想要延迟初始化,因为我要创建的类将从头到尾都存在。但是这个线程安全吗?(据我所知,这似乎还可以)
如果这没问题,那么我应该使用这样的通用编程,
template <class T>
class GenericSingleton
{
private:
static T _instance;
public:
static T * GetInstance()
{
return &_instance;
}
};
template <class T>
T GenericSingleton<T>::_instance;
所以我也可以将它与任何其他类一起使用。我只需要添加friend class GenericSingleton<MySelf>;
到所需的 sigleton(例如添加到 MySelf 类)。
这种实现会引起麻烦吗?我实际上正在创建一个库。一些单例将被导出,而有些则不会。另外,如果这不是一个库,而只是另一个应用程序怎么办?
- 编辑 -
所以现在我必须这样做(因为我使用的是仍然不支持 C++11 的 VC++),
static MySelf & GetInstance()
{
WaitForMutex(mymutex); // some function from the threading library
if( NULL == _instance )
{
_instance = new MySelf();
}
ReleaseMutex(mymutex); // release function of the same library
Return _instance;
}
并告诉用户使用该功能一次,然后将其缓存以供使用。(或者我也可以将函数重命名为Initialize()
并创建另一种方法来仅返回引用而无需任何锁定或创建。)那么mymutex
应该在哪里?它应该在哪里初始化?