1. 类说明
1. 功能
- muduo的线程安全类
2. 继承
- noncopyable
2. 成员变量说明
- ponce_
- pthread_once_t类型,保证某个函数只被执行一次,见下面的instance()函数
- value_
- 值
3. 成员函数说明
1. 普通
-
删除构造和析构(单实例)
-
instance()
- 获得该类对象,单实例模式
- pthread_once保证Singleton::init函数只被执行一次,完成单实例
2. 私有
- init()
- 创建对象
- atexit()登记销毁函数,在程序结束后调用销毁
- 这里使用了has_no_destroy,这是SFINAE 技术,即匹配失败不是错误,英文Substitution Failure Is Not An Error,其作用是当我们在进行模板特化的时候,会去选择那个正确的模板,避免失败,这种技术在代码中的一个大的用途就是在编译时期来确定某个 type 是否具有我们需要的性质
- 这里的has_no_destroy其作用就是用来判断是否有 no_destroy 函数,如果有no_destroy函数,就不注册destroy函数了
- has_no_destroy中用了decltype,这也是个声明类型的关键字,具体的自己搜吧,我见过的最常用的用法是和auto搭配完成返回类型后置,如下
template<typename T> auto add(T const& x, T const& y) -> decltype (x + y) { return x + y; }
- destroy()
- T_must_be_complete_type,保证对象必须是complete_type,不能是incomplete_type,这是一种技巧,如果sizeof(T)==0,这就是一个incomplete_type,这样就是-1,这是定义了一个数组类型,数组类型[]内不能是-1,所以就会报错,在编译时检测出错误
- 什么是incomplete_type?例如只有类定义:class A;这就是什么是incomplete_type