博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++ 单例模式最佳写法
阅读量:6038 次
发布时间:2019-06-20

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

pthread_once

class Singleton {

public:
static Singleton *GetInstance() {
pthread_once(&ponce_, &Singleton::init);
return value_;
}
private:
Singleton() {}
Singleton(const Singleton &);
Singleton& operator= (const Singleton &);
static void init() {
value_ = new T();
}
static pthread_once_t ponce_;
static Singleton *value_;
};
pthread_once_t SIngleton::ponce_ = PTHREAD_ONCE_INIT;
Singleton* Singleton::value_ = NULL;
---------------------

饿汉模式

必须在main开始前就初始化好,于是,需要一个静态变量。可以是对象,也可以是对象的指针。如果是指针,在main开始前new一下就行。由于这个静态变量只会被单例类使用,所以最好不是静态全局变量,而是类的静态成员变量。

// 对象版

// singleton.h
class Singleton {
private:
Singleton() {}
Singleton(const Singleton &);
Singleton& operator= (const Singleton &);
static Singleton s;
public:
static Singleton *GetInstance() {
return &s;
}
};
// singleton.cc
Singleton Singleton::s;
还有:

//指针版。没有析构逻辑,会造成泄露。

// singleton.h
class Singleton {
private:
Singleton() {}
Singleton(const Singleton &);
Singleton& operator= (const Singleton &);
static Singleton *p;
public:
static Singleton *GetInstance() {
return p;
}
};
// singleton.cc
Singleton *Singleton::p = new Singleton;

 

 

class Singleton

{
private:
static Singleton* m_instance;
Singleton(){}
public:
static Singleton* getInstance();
};

Singleton* Singleton::getInstance()

{
if(NULL == m_instance)
{
Lock();//借用其它类来实现,如boost
if(NULL == m_instance)
{
m_instance = new Singleton;
}
UnLock();
}
return m_instance;
}

 

 

 

 

 

 

 

====================

MasterConf* MasterConf::instance_ = NULL;

pthread_mutex_t MasterConf::mutex_ = PTHREAD_MUTEX_INITIALIZER;

MasterConf* MasterConf::GetInstance() {

if (NULL == instance_) {
pthread_mutex_lock(&mutex_);
if (NULL == instance_) {
instance_ = new MasterConf();
}
pthread_mutex_unlock(&mutex_);
}

return instance_;

}

转载于:https://www.cnblogs.com/huxiaoting/p/10918064.html

你可能感兴趣的文章
差异分析定位Ring 3保护模块
查看>>
2013年7月12日“修复 Migration 测试发现的 Bug”
查看>>
vim文本编辑器详解
查看>>
学习vue中遇到的报错,特此记录下来
查看>>
CentOS7 编译安装 Mariadb
查看>>
32位系统和64位系统的选择
查看>>
01配置管理过程指南
查看>>
jstl格式化时间
查看>>
一则关于运算符的小例
查看>>
centos7 ambari2.6.1.5+hdp2.6.4.0 大数据集群安装部署
查看>>
cronexpression 详解
查看>>
一周小程序学习 第1天
查看>>
小孩的linux
查看>>
SpringMVC、MyBatis声明式事务管理
查看>>
开发者详解:端游及手游服务端的常用架构
查看>>
JavaScript History对象
查看>>
在 Windows 下安装 Oracle 11g XE (Express Edition)
查看>>
ListView优化
查看>>
【原创】 PostgreSQL 实现MySQL 的auto_increment 字段
查看>>
vs2015添加vc助手
查看>>