簡介
本文介紹單例模式實現(xiàn)的另外兩種方法:
- 通過double check(借助std::atomic)實現(xiàn)單例模式
- 采用static member實現(xiàn)單例模式
double check實現(xiàn)單例模式
在使用double check來實現(xiàn)線程安全的單例模式中,我們需要使用std::atomic
來實現(xiàn)必要的同步。
class SingleTon {
public:
static SingleTon* getInstance(void)
{
if(s_p.load() == nullptr){
std::lock_gurad<std::mutex> lk(s_mtx);
if(s_p.load() == nullptr){
auto p = new SingleTon();
s_p.store(p);
}
}
return s_p.load();
}
public:
int getValue() {
return m_int;
}
private:
static std::mutex s_mtx;
static std::atomic<SingleTon*> s_p;
SingleTon(SingleTon&) = delete;
SingleTon& operator=(SingleTon&) = delete;
SingleTon(SingleTon&&) = delete;
SingleTon& operator=(SingleTon&&) = delete;
SingleTon() {
m_int = 0;
}
private:
int m_int;
};
借助static member實現(xiàn)單例模式
在c++11中,c++標準開始支持多線程模式,函數(shù)內(nèi)部的靜態(tài)成員變量的初始化為線程安全的,
這也很大的簡化了單例模式的實現(xiàn)方始。
class SingleTon {
public:
static SingleTon& getInstance(void)
{
static SingleTon s_singleTon(); //采用靜態(tài)成員變量
return s_singleTon;
}
public:
int getValue() {
return m_int;
}
private:
SingleTon(SingleTon&) = delete;
SingleTon& operator=(SingleTon&) = delete;
SingleTon(SingleTon&&) = delete;
SingleTon& operator=(SingleTon&&) = delete;
SingleTon() {
m_int = 0;
}
private:
int m_int;
};