您的位置:首页 > 其它

muduo库源码解析:单例模式singleton

2015-12-12 17:09 260 查看
单例模式实现

boost::noncopyable 防止复制,如果是自己实现,那要把构造函数拷贝构造,复制构造都私有

公有方法:

获取单例对象:instance() 返回 value 引用,(第一次 -->pthread_once --> init )

私有

初始化new一单例:init()--并 atexit 注册销毁函数释放delete value

构造函数、拷贝构造,复制构造

析构函数

静态实际对象vaue指针,静态pthread_once_t

1.空用一个变量tt,声明了变量但是没有使用 编译时加 Wno-unused-parameter,会报错

(void) tt;

2.防止delete一个不完全对象

//typedef定义一个char数组类型 T_MUST_BE_COMPELET_TYPE :char[-1]---如果T只声明没有定义-不完全类型, 没定义就没有析构函数,delete就不会调用析构函数了; char[1]--T是完全类型,即有定义,delete操作,可以调用析构函数

typedef char T_must_be_complete_type[sizeof(T)==0?-1:1];

//下面两句主要是防止报错,Werror=unused-local-typedefs,Wno-unused-parameter

T_must_be_complete_type tt;

(void)tt;

#ifndef MUDUO_BASE_SINGLETION_h
#define MUDUO_BASE_SINGLETION_h

#include <boost/noncopyable.hpp>
#include <pthread.h>
#include <stdlib.h> //atexit

namespace muduo
{

template<typename T>
class Singleton : boost::noncopyable
{
public:
static T& instance()
{
pthread_once( &ponce_, Singleton::init );
return *value_;
}

private:
Singleton();
~Singleton();
static void init()
{
value_ = new T();
atexit(destroy);
}
static void destroy()
{
//定义一个char数组类型 T_MUST_BE_COMPELET_TYPE :char[-1]---如果T只声明没有定义-不完全类型 ; char[1]--T是完全类型,即有定义,delete操作,可以调用析构函数,没定义就没有析构函数,delete就不会调用析构函数了
typedef char T_must_be_complete_type[sizeof(T)==0?-1:1];
T_must_be_complete_type tt;
(void)tt;
delete value_;
}
private:
static pthread_once_t ponce_; //但是,只有一份,所以要静态!!
static T* value_;             //要静态!!
};

template<typename T>
pthread_once_t Singleton<T>::ponce_ = PTHREAD_ONCE_INIT;

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

}


参考:c++教程网

muduo网络库

linux多线程服务器端编程》.陈硕
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: