单例模式模板类
@(C/C++学习笔记)
- 模板类
#if defined(__SUPPORT_TS_ANNOTATION__) || defined(__clang__)
#define THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x))
#else
#define THREAD_ANNOTATION_ATTRIBUTE__(x) // no-op
#endif
#define GUARDED_BY(x) THREAD_ANNOTATION_ATTRIBUTE__(guarded_by(x))
template <typename T>
class Singleton{
public:
//确保不会被构造出来
Singleton() = delete;
~Singleton() = delete;
static T& getInstance(){
//保护临界区:多线程安全
pthread_mutex_lock(&mutex_);
if(instance_==nullptr){
instance_ = new T();
}
pthread_mutex_unlock(&mutex_);
return *instance_;
}
private:
//资源管理,在析构时释放堆上资源
class Delete{
public:
~Delete(){
if(Singleton::instance_!=nullptr)
delete Singleton::instance_;
}
private:
};
static Delete deletor;
static pthread_mutex_t mutex_;
static T* instance_ GUARDED_BY(mutex_);
};
template<typename T>
T* Singleton<T>::instance_ = nullptr;
template<typename T>
pthread_mutex_t Singleton<T>::mutex_ = PTHREAD_MUTEX_INITIALIZER;
- 模板类的使用
class LOG{
//使单例模板能去构造Log类
friend class Singleton<LOG>;
public:
//保证该类不会被拷贝
LOG(const LOG&) = delete;
~LOG(){};
ostream& operator<<(string data){
pthread_mutex_lock(&mutex_);
out_<<data<<endl;
pthread_mutex_unlock(&mutex_);
return out_;
}
private:
LOG(ostream& out = cout):out_(out){};
ostream& out_;
pthread_mutex_t mutex_ = PTHREAD_MUTEX_INITIALIZER;
};
auto sLog = &Singleton<LOG>::getInstance;