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;
参考:c++教程网
muduo网络库
linux多线程服务器端编程》.陈硕
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多线程服务器端编程》.陈硕
相关文章推荐
- 阻塞库函数
- 学习opencv(2)——cvSave和cvLoad
- 自定义tabbar pop控制器 tabbar 重叠问题
- linux 硬盘限额
- linux shell脚本,检测 服务是否启动,如果启动,将其关闭
- [javase学习笔记]-3.1 if语句
- Ubuntu:编译Linux"内核源代码"和"内核模块"
- UML——构件图、部署图
- WIN10 多用户登录
- WORD里怎样能做到局部“分栏”就是一页里有的分有的不分
- 内容提供器(1)/2 内容提供器读取联系人
- 软件测试与公司质量关系
- [SpringMVC] @ResponseBody 返回中文乱码
- Flannel实现Docker容器跨主机通信
- UVa 105 - The Skyline Problem(利用判断,在于想法)
- LAMP 3.1 mysql的root密码重置
- 利用函数实现乘法口诀表
- 项目框架从tomcat移植到weblogic
- java图形程序设计之框架搭建
- 音乐满堂彩制作