muduo之Singleton_muduo singleton-程序员宅基地

技术标签: muduo源码学习  

         muduo中的单例模式

Singleton.h

// Use of this source code is governed by a BSD-style license
// that can be found in the License file.
//
// Author: Shuo Chen (chenshuo at chenshuo dot com)

#ifndef MUDUO_BASE_SINGLETON_H
#define MUDUO_BASE_SINGLETON_H

#include "muduo/base/noncopyable.h"

#include <assert.h>
#include <pthread.h>
#include <stdlib.h> // atexit

namespace muduo
{

namespace detail
{
// This doesn't detect inherited member functions!
// http://stackoverflow.com/questions/1966362/sfinae-to-check-for-inherited-member-functions
template<typename T>
struct has_no_destroy
{
  //decltype选择并返回操作数的数据类型
  template <typename C> static char test(decltype(&C::no_destroy));
  template <typename C> static int32_t test(...);
  const static bool value = sizeof(test<T>(0)) == 1;//判断如果是类的话,是否有no_destroy方法
};
}  // namespace detail




template<typename T>    
class Singleton : noncopyable
{
 public:
  Singleton() = delete;
  ~Singleton() = delete;

  static T& instance()				//static,保证可以通过类作用域运算符进行调用
  {
  	//pthread_once()函数,在多线程中,保证某个函数只被执行一次。<pthread.h>
    pthread_once(&ponce_, &Singleton::init);	
    assert(value_ != NULL);
    return *value_;
  }

 private:
  static void init()
  {
    value_ = new T();   //根据传入的类型进行new
    if (!detail::has_no_destroy<T>::value)//当参数是类且没有"no_destroy"方法才会注册atexit的destroy
    {
    	//注册一个函数,在程序终止时执行
      ::atexit(destroy);//登记atexit时调用的销毁函数,防止内存泄漏
    }
  }

  static void destroy()
  {
    用typedef定义了一个数组类型,数组的大小不能为-1,利用这个方法,如果是不完全类型,编译阶段就会发现错误
    定义一个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 dummy; (void) dummy;

    delete value_;
    value_ = NULL;
  }

 private:
  //pthread_once参数
  static pthread_once_t ponce_;
  static T*             value_;//指向一个实例
};




//static需要在类外进行初始化
template<typename T>
	
//创建一个全局的Singleton<T>::ponce_变量,体现static的作用
pthread_once_t Singleton<T>::ponce_ = PTHREAD_ONCE_INIT;  //ponce_初始化

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

}  // namespace muduo

#endif  // MUDUO_BASE_SINGLETON_H

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ma2595162349/article/details/102789737

智能推荐

DGL中的消息传递相关内容的讲解_graph.apply_edges-程序员宅基地

文章浏览阅读1.6k次,点赞8次,收藏10次。学会DGL中的消息传递,基本就能够比较好的来理解编写各种图神经网络的代码了吧。消息传递是实现GNN的一种通用框架和编程范式。它从聚合与更新的角度归纳总结了多种GNN模型的实现。因此在DGL代码编写消息传递部分时,我们需要三个函数,分别是消息函数、聚合函数、更新函数。简单来说就是:消息函数用来取边和节点的特征。聚合函数用来计算边和节点的特征,例如特征求和,根据特征求个注意力权重等等。更新函数用来更新节点的特征,对聚合函数传来的特征可以过个激活函数等,最后得到最终的节点特征即可更新。在DGL中,消息_graph.apply_edges

前端学习之路之Axure RP 9的高级功能(3)_axure9的新功能-程序员宅基地

文章浏览阅读369次,点赞2次,收藏2次。变量和动态模版的使用_axure9的新功能

实用,完整的HTTP cookie指南_credentials include-程序员宅基地

文章浏览阅读3.2k次,点赞4次,收藏10次。作者:valentinog译者:前端小智来源:valentinog点赞再看,微信搜索 【大迁世界】 关注这个没有大厂背景,但有着一股向上积极心态人。本文 GitHub https://github.com/qq449245884/xiaozhi 上已经收录,文章的已分类,也整理了很多我的文档,和教程资料。Web 开发中的 cookie 是什么?cookie 是后端可以存储在用户浏览器中的小块数据。 Cookie 最常见用例包括用户跟踪,个性化以及身份验证。Cookies 具有很多隐私问._credentials include

推荐系统_(一)算法详解_基于人口统计学的推荐算法-程序员宅基地

推荐系统的算法详解包括基于人口统计学的推荐算法和基于内容的推荐算法。基于人口统计学的推荐算法主要通过用户画像来进行推荐,而基于内容的推荐算法则通过相似度计算和特征工程来进行推荐。此外,还介绍了ALS和梯度下降算法。

go语言编写php扩展,golang 编写 PHP 扩展-程序员宅基地

文章浏览阅读133次。phper 都知道 php-extension 采用 C/C++ 编写.由于 C/C++ 开发效率问题我们来采用 golang 编写 php-extension充分利用 golang 的开发效率和生态给 PHP 添砖加瓦.环境准备wsl ubuntugolang 1.13php 7.3新建项目php7.3 里面的 ext_skel 和以前版本参数不一样,请查看 help 操作php:./ext..._封装一个go的扩展给php程序调用

python 删除print()两个输出语句之间的空格_print中间有空格-程序员宅基地

文章浏览阅读2.6k次,点赞2次,收藏3次。python 删除print()两个输出语句之间的空格。回文诗:静思伊久阻归期忆别离时闻漏转。_print中间有空格

随便推点

关于工信部发布的app备案以及小程序备案流程_app备案政策文件的原地址-程序员宅基地

文章浏览阅读1k次。关于工信部发布的app备案以及小程序备案_app备案政策文件的原地址

STM32H7模拟量引脚分布_mcu 当中 pc2 与 pc2_c-程序员宅基地

文章浏览阅读2.8k次,点赞2次,收藏5次。之前用的F1系列,都是单端信号,所以分布管脚基本上都是相连的,比较好记忆。而H7系列,具有差分信号输入功能,所以会和F系列在管脚分布上不太一样。H7系列多了一种ANA类型:而LQFP类型封装的只有PC2_C和PC3_C,没有PC2和PC3。实际上也就是多了几个引脚给我们用:STM32H743 芯片ADC1~ADC3引脚对应关系表而根据我们选择的芯片型号:STM32H743VIT..._mcu 当中 pc2 与 pc2_c

【C++学习笔记】1.5 extern “C“_extern c 头文件-程序员宅基地

文章浏览阅读882次,点赞7次,收藏11次。在函数前加extern "C",意思是告诉编译器,将该函数按照C语言规则来编译。_extern c 头文件

vim命令-程序员宅基地

文章浏览阅读48次。vim是从vi发展出来的一个文本编辑器,它为用户提供了许多新特性和命令。在使用vim:启动vim后默认进入的模式,可以使用各种快捷键命令来操作文本。:在此模式下可以输入文本。:可以选择文本,然后进行复制、剪切、粘贴等操作。:可以输入命令,如保存文件或退出vim。以下是一些vim。

【CV第一篇】计算机视觉的四大基本任务_cv任务-程序员宅基地

文章浏览阅读5.2k次,点赞9次,收藏48次。修炼一途,乃窃阴阳,夺造化,转涅槃,握生死,掌轮回。武之极,破苍穹,动乾坤!! ——《武动乾坤》_cv任务

matlab医学图像处理实现读取图片头文件信息,图片三等分及灰度图绘制 ( 医学图像处理教材示例一)_医学图像处理与分析课本示例代码答案-程序员宅基地

文章浏览阅读3k次,点赞9次,收藏43次。matlab实现读取图片头文件信息,图片三等分及灰度图绘制医学图像处理教材示例一此文章是医学图像处理与分析第二版教材示例一代码1 解读下面图像的文件头和位图信息数据程序如下clearfid=fopen('示例一.bmp','r');fileinfo=(fread(fid,54)); %此处54为读取行数读取结果为一个列矩阵每行对应结果如图。15行之后还有其他数据,..._医学图像处理与分析课本示例代码答案