博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[C++设计模式] singleton 单例模式
阅读量:6528 次
发布时间:2019-06-24

本文共 1316 字,大约阅读时间需要 4 分钟。

这个设计模式主要目的是想在整个系统中仅仅能出现一个类的实例。这样做当然是有必定的。比方你的软件的全局配置信息,或者是一个Factory,或是一个主控类,等等。

你希望这个类在整个系统中仅仅能出现一个实例。

一、调用pthread_once()实现了一个线程安全的版本号:

 

代码:

template 
class Singleton{public: static T& instance() { pthread_once(&ponce_,&Singleton::init); return *value_; } static void init()//加了一层封装,适应不同类型的初始化函数 { value_ = new T(); }private: Singleton(); ~Singleton(); static pthread_once_t ponce_; static T * value_;};template
pthread_once_t Singleton
::ponce_=PTHREAD_ONCE_INIT;//Linux下初始化为0;template
T* Singleton
::value_=NULL;

二、双重检查加锁法

class Singleton{public:	static Singleton *GetInstance()	{		if (m_Instance == NULL )		{			Lock lock; // Lock为管理相互排斥锁的资源类,会在该函数退出时自己主动释放			if (m_Instance == NULL )			{				m_Instance = new Singleton ();			}					}		return m_Instance;	}	static void DestoryInstance()	{		if (m_Instance != NULL )		{			delete m_Instance;			m_Instance = NULL ;		}	}	int GetTest()	{		return m_Test;	}private:	Singleton(){ m_Test = 0; }	static Singleton *m_Instance;	int m_Test;};Singleton *Singleton ::m_Instance = NULL;
双重检查加锁的优势在于:

(1)没有实例化Singleton时,全部调用静态函数GetInstance的线程都会堵塞在lock上,仅仅有第一个调用者能获取该lock,实例化该类。

(2)已经实例化Singleton时。全部调用者线程就不用排队获取lock。直接获取实例化对象

转载地址:http://fatbo.baihongyu.com/

你可能感兴趣的文章
java Windows7 下环境变量设置
查看>>
NBU异构还原Oracle完整备份的一些总结
查看>>
freeBSD安装详细讲解
查看>>
WSFC2016 VM弹性与存储容错
查看>>
文档管理,文本编辑控件TX Text Control .NET for WPF
查看>>
复习 Python 匿名函数 内建函数
查看>>
Security Identifiers | Win SRV2016 SID Change 修改
查看>>
看看来自日本的扫描,做网站需要注意的
查看>>
JDK 1.7+Android SDK+IntelliJ IDEA 13+Genymotion 安卓开发环境部署
查看>>
钓鱼邮件***防范指南
查看>>
session_start()放置位置的不正确引发的ROOT常量 未定义的错误
查看>>
如何设定VDP同时备份的任务数?
查看>>
ipsec的***在企业网中的经典应用
查看>>
过来人谈《去360还是留在百度?》
查看>>
mysql备份工具innobackupex,xtrabackup-2.1安装,参数详解
查看>>
【复制】slave筛选复制之二(create/drop table语句)
查看>>
Movie Store OpenCart 自适应主题模板 ABC-0249
查看>>
mytop-MySQL监控工具
查看>>
RedHat linux YUM本地制作源
查看>>
apache端口占用问题
查看>>