单线程:
class Singleton
{
private:
static Singleton* _instance;
Singleton()
{
}
public:
static Singleton* Instance()
{
if (nullptr == _instance)
_instance = new Singleton();
return _instance;
}
static void DestoryInstance()
{
if (nullptr != _instance)
{
delete _instance;
_instance = nullptr;
}
}
void fun()
{
cout << "fun" << endl;
}
};
Singleton* Singleton::_instance = nullptr;
C++11多线程:
class Singleton
{
private:
Singleton()
{
}
public:
static Singleton* Instance()
{
static Singleton m_instance;
return &m_instance;
}
void fun()
{
cout << "fun" << endl;
}
};
注:C++11标准才支持线程安全的局部静态变量初始化。
C++memory model中定义static local variable:The initialization of such a variable is defined to occur the first time control passes through its declaration; for multiple threads calling the function, this means there’s the potential for a race condition to define first.
C++11另一种方式:
class Singleton
{
private:
static Singleton* _instance;
static once_flag flag;
Singleton()
{
}
public:
static Singleton* Instance()
{
call_once(flag, []() { _instance = new Singleton();});
return _instance;
}
void fun()
{
cout << "fun" << endl;
}
};
Singleton* Singleton::_instance = nullptr;
once_flag Singleton::flag;
int main()
{
vector<thread> vt;
for (int i = 0; i < 100; ++i)
{
vt.push_back(thread([]() {
Singleton* single = Singleton::Instance();
single->fun();
}));
}
for_each(vt.begin(), vt.end(), mem_fn(&thread::join));
system("pause");
return 0;
}