单身对象可以泛指一些系统需要保存的中间状态,通常如果一个接口函数,如果里面保存有状态,则可以认为存在着一个单身对象。
单身对象在任何情况下,只能构造一次,构造的过程在什么时候做,是非常讲究的,你如果提供初始化函数,比如WinSocketAPI的初始化函数WSAInit,那你要自己控制好调用顺序,确保它先于其它API的调用之前被调用。
有一种简单做法,结果是这样的,在第一次调用应用接口的时候初始化,反初始化就不做了,不反初始化的原因是,它是单身,它的生命期为整个进程生命期。典型做代码像这样:
void _Init()
{
...
}
MY_API int DoSomething()
{
if (未初始化)
{
线程加锁
if (未初始化)
{
_Init();
}
线程解锁
}
。。。
}
在锁里面要再判断一次。
将来的新的C++会支持函数内静态对象的构造是线程安全的,就可以这么写:
XXX& GetXXXInstance()
{
static XXX s_Obj;
return s_Obj;
}