1.Singleton类图

线程安全Singleton类实现
(1)pthread_once
(2)atexit
(3)typedef char T_must_be_complete_type[sizeof(T) == 0 ? -1 : 1];

2.代码

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 <boost/noncopyable.hpp>
#include <pthread.h>
#include <stdlib.h> // atexitnamespace 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(){typedef char T_must_be_complete_type[sizeof(T) == 0 ? -1 : 1];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;}
#endif

Singleton_test.cc

#include <muduo/base/Singleton.h>
#include <muduo/base/CurrentThread.h>
#include <muduo/base/Thread.h>#include <boost/noncopyable.hpp>
#include <stdio.h>class Test : boost::noncopyable
{public:Test(){printf("tid=%d, constructing %p\n", muduo::CurrentThread::tid(), this);}~Test(){printf("tid=%d, destructing %p %s\n", muduo::CurrentThread::tid(), this, name_.c_str());}const muduo::string& name() const { return name_; }void setName(const muduo::string& n) { name_ = n; }private:muduo::string name_;
};void threadFunc()
{printf("tid=%d, %p name=%s\n",muduo::CurrentThread::tid(),&muduo::Singleton<Test>::instance(),muduo::Singleton<Test>::instance().name().c_str());muduo::Singleton<Test>::instance().setName("only one, changed");
}int main()
{muduo::Singleton<Test>::instance().setName("only one");muduo::Thread t1(threadFunc);t1.start();t1.join();printf("tid=%d, %p name=%s\n",muduo::CurrentThread::tid(),&muduo::Singleton<Test>::instance(),muduo::Singleton<Test>::instance().name().c_str());
}

运行结果

17muduo_base库源码分析(八)相关推荐

  1. 《微信小程序-进阶篇》Lin-ui组件库源码分析-列表组件List(一)

    大家好,这是小程序系列的第二十篇文章,在这一个阶段,我们的目标是 由简单入手,逐渐的可以较为深入的了解组件化开发,从本文开始,将记录分享lin-ui的源码分析,期望通过对lin-ui源码的学习能加深组 ...

  2. Android主流三方库源码分析(九、深入理解EventBus源码)

    一.EventBus使用流程概念 1.Android事件发布/订阅框架 2.事件传递既可用于Android四大组件间通信 3.EventBus的优点是代码简洁,使用简单,事件发布.订阅充分解耦 4.首 ...

  3. 【转】ABP源码分析八:Logger集成

    ABP使用Castle日志记录工具,并且可以使用不同的日志类库,比如:Log4Net, NLog, Serilog... 等等.对于所有的日志类库,Castle提供了一个通用的接口来实现,我们可以很方 ...

  4. sigslot库源码分析

    言归正传,sigslot是一个用标准C++语法实现的信号与槽机制的函数库,类型和线程安全.提到信号与槽机制,恐怕最容易想到的就是大名鼎鼎的Qt所支持的对象之间通信的模式吧.不过这里的信号与槽虽然在概念 ...

  5. surprise库源码分析

    最近工作上需要使用到协同过滤,来计算相似度,因此根据https://blog.csdn.net/weixin_43849063/article/details/111500236的步骤对surpris ...

  6. Python Requests库源码分析

    1. Requests库简介 书籍是人类进步的阶梯,源码是程序员进步的阶梯.为了进步,我们就要不断地阅读源码,提升自己的技术水平.今天我们来剖析一下Python的Requests库. Requests ...

  7. Spring Security源码分析八:Spring Security 退出

    为什么80%的码农都做不了架构师?>>> Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spr ...

  8. Spring源码分析八:Mybatis ORM映射框架原理

    文章目录 (一)Mybatis单独操作数据库程序 1.1.数据库表 1.2.建立PO 1.3.建立mapper接口映射 1.4.建立Mybatis配置文件 1.5.建立mapper映射文件 1.6.测 ...

  9. mybatis的使用及源码分析(八) mybatis的rowbounds分析

    Mybatis提供了一个简单的逻辑分页类RowBounds,其原理类似于在内存中做了一个分页,不是数据库层面的分页,性能不算好,谨慎使用 一. RowBounds源码分析 1 RowBounds源码: ...

最新文章

  1. 为什么edge AI是一个无需大脑的人
  2. [ webpack4 ] 配置属于自己的打包系统教程(最终篇)—— 环境配置篇
  3. adt+选择android+sdk,eclipse+adt+android SDK 开发搭建环境中遇到的问题
  4. 2020 Jiangsu Collegiate Programming Contest
  5. oracle 命令分析
  6. html让文本框左剧中对齐_HTML 样式 CSS
  7. DSP28335代码生成——如何使用两个中断
  8. 利用HTML简单语句来制作个人简历
  9. Pandas学习任务1-3
  10. Python3 获取法定节假日
  11. nginx root 和alise
  12. python统计分析书籍_Python数据分析入门书籍推荐
  13. 小米米家投影仪青春版怎么样,和当贝d3x怎么选全面解析让你知道
  14. PDF文件如何添加签名
  15. sublime运行python只显示时间_sublime3-python 编译运行不显示内容
  16. 【转知乎】异地恋如何维持之电子本科生
  17. 原创 【我的OpenGL学习进阶之旅】介绍一下OpenGL ES的 遮挡查询
  18. 最大流问题与福特-富尔克森算法
  19. 如何在Ubuntu 14.04上使用NSD——一套仅权威DNS服务器
  20. 解决 Arch/Manjaro Linux AUR 的 MindMaster 无法输入中文和登录的问题

热门文章

  1. 利用Dockerfile构建一个nginx容器
  2. 【HDOJ】2266 How Many Equations Can You Find
  3. Android 可以输入的下拉框
  4. SharePoint2010部署(一)---数据库的安装
  5. IIS5IIS6IIS7的ASP.net 请求处理过程比较(转)
  6. Windows Server 2003 SP2 RIS 配置问题
  7. Linux Exploit系列之七 绕过 ASLR -- 第二部分
  8. .Net脱壳工具 de4dot参数说明/简易教程
  9. 深入分析同步工具类之AbstractQueuedSynchronizer
  10. CodeFores 665D Simple Subset(贪心)