用C++实现单例模式

来源:互联网 发布:缺德的医生 知乎 编辑:程序博客网 时间:2024/06/18 05:39

1.C++11

借助std::call_once和std::once_flag

#include<mutex>

template<typename T>
class Singleton{
public:
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
static T& instance(){
std::call_once(once_flag_, Singleton::init);
return *value_;
}
private:
static void init(){
value_ = new T();
}
private:
    //由于会被static成员函数访问,所以这两个数据成员也需要是static的
static std::once_flag once_flag_;
static T* value_;
};

//std::once_flag是默认初始化的
template<typename T>
std::once_flag Singleton<T>::once_flag_;

template<typename T>
T* Singleton<T>::value_ = nullptr;


2.C++11

使用local static,C++11保证了,local static初始化时是多线程安全的。

template<typename T>
class Singleton{
public:
    static T& instance(){
        static T t;
        return t;
    }
};

就是如此简单


3.C++98

使用pthread_once缺点是只适用于POSIX平台,windows平台需要使用对应的移植库。

#include<pthread>

template<typename T>

class Singleton{

public:

static T& instance(){

pthread_once(&ponce_, &Singleton::init);

return *value_;

}

private:

Singleton(const Singleton&);

Singleton& operator=(const Singleton&);

Singleton();

~Singleton();

void init(){

value_ = new T();

}

private:

static pthread_once_t ponce_;

static T* value_;

};


template<typename T>

pthread_once_t Singleton<T>::ponce_ = PTHREAD_ONCE_INIT;

tempalte<typename T>

T* value_ = NULL;


0 0
原创粉丝点击