17muduo_base库源码分析(八)
1.Singleton类图
2.代码
// 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库源码分析(八)相关推荐
- 《微信小程序-进阶篇》Lin-ui组件库源码分析-列表组件List(一)
大家好,这是小程序系列的第二十篇文章,在这一个阶段,我们的目标是 由简单入手,逐渐的可以较为深入的了解组件化开发,从本文开始,将记录分享lin-ui的源码分析,期望通过对lin-ui源码的学习能加深组 ...
- Android主流三方库源码分析(九、深入理解EventBus源码)
一.EventBus使用流程概念 1.Android事件发布/订阅框架 2.事件传递既可用于Android四大组件间通信 3.EventBus的优点是代码简洁,使用简单,事件发布.订阅充分解耦 4.首 ...
- 【转】ABP源码分析八:Logger集成
ABP使用Castle日志记录工具,并且可以使用不同的日志类库,比如:Log4Net, NLog, Serilog... 等等.对于所有的日志类库,Castle提供了一个通用的接口来实现,我们可以很方 ...
- sigslot库源码分析
言归正传,sigslot是一个用标准C++语法实现的信号与槽机制的函数库,类型和线程安全.提到信号与槽机制,恐怕最容易想到的就是大名鼎鼎的Qt所支持的对象之间通信的模式吧.不过这里的信号与槽虽然在概念 ...
- surprise库源码分析
最近工作上需要使用到协同过滤,来计算相似度,因此根据https://blog.csdn.net/weixin_43849063/article/details/111500236的步骤对surpris ...
- Python Requests库源码分析
1. Requests库简介 书籍是人类进步的阶梯,源码是程序员进步的阶梯.为了进步,我们就要不断地阅读源码,提升自己的技术水平.今天我们来剖析一下Python的Requests库. Requests ...
- Spring Security源码分析八:Spring Security 退出
为什么80%的码农都做不了架构师?>>> Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spr ...
- Spring源码分析八:Mybatis ORM映射框架原理
文章目录 (一)Mybatis单独操作数据库程序 1.1.数据库表 1.2.建立PO 1.3.建立mapper接口映射 1.4.建立Mybatis配置文件 1.5.建立mapper映射文件 1.6.测 ...
- mybatis的使用及源码分析(八) mybatis的rowbounds分析
Mybatis提供了一个简单的逻辑分页类RowBounds,其原理类似于在内存中做了一个分页,不是数据库层面的分页,性能不算好,谨慎使用 一. RowBounds源码分析 1 RowBounds源码: ...
最新文章
- 为什么edge AI是一个无需大脑的人
- [ webpack4 ] 配置属于自己的打包系统教程(最终篇)—— 环境配置篇
- adt+选择android+sdk,eclipse+adt+android SDK 开发搭建环境中遇到的问题
- 2020 Jiangsu Collegiate Programming Contest
- oracle 命令分析
- html让文本框左剧中对齐_HTML 样式 CSS
- DSP28335代码生成——如何使用两个中断
- 利用HTML简单语句来制作个人简历
- Pandas学习任务1-3
- Python3 获取法定节假日
- nginx root 和alise
- python统计分析书籍_Python数据分析入门书籍推荐
- 小米米家投影仪青春版怎么样,和当贝d3x怎么选全面解析让你知道
- PDF文件如何添加签名
- sublime运行python只显示时间_sublime3-python 编译运行不显示内容
- 【转知乎】异地恋如何维持之电子本科生
- 原创 【我的OpenGL学习进阶之旅】介绍一下OpenGL ES的 遮挡查询
- 最大流问题与福特-富尔克森算法
- 如何在Ubuntu 14.04上使用NSD——一套仅权威DNS服务器
- 解决 Arch/Manjaro Linux AUR 的 MindMaster 无法输入中文和登录的问题
热门文章
- 利用Dockerfile构建一个nginx容器
- 【HDOJ】2266 How Many Equations Can You Find
- Android 可以输入的下拉框
- SharePoint2010部署(一)---数据库的安装
- IIS5IIS6IIS7的ASP.net 请求处理过程比较(转)
- Windows Server 2003 SP2 RIS 配置问题
- Linux Exploit系列之七 绕过 ASLR -- 第二部分
- .Net脱壳工具 de4dot参数说明/简易教程
- 深入分析同步工具类之AbstractQueuedSynchronizer
- CodeFores 665D Simple Subset(贪心)