栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【Singleton模式】C++设计模式——单例模式

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Singleton模式】C++设计模式——单例模式

单例模式
  • 一、设计流程探讨
  • 二、模式介绍
  • 三、代码实现

    C++设计模式大全,23种设计模式合集详解—(点我跳转)

一、设计流程探讨

  单例模式的结构非常简单,如下类图所示。在单例模式种,需要注意多线程的问题,多线程会导致不一定遵循单例,本文将在代码实现种进行讨论。首先在该模式种,我们需要将构造函数、拷贝构造函数设置为私有的,如果不这么做C++编译器将会默认给你生产公有的构造函数,这样外界就可以访问到这构造函数了,然后设置静态的变量。

  在了解单例模式之前,建议大家先去了解下C++各种锁的知识,有助于理解单例模式中的安全锁的问题。

二、模式介绍

(1)模式动机
  在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、良好的效率。
  如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?这应该是类设计者的责任,而不是使用者的责任。
(2)模式定义
  保证一个类仅有一个实例,并提供一个该实例的全局访问点。
(3)要点总结
 a). Singleton模式中的实例构造器一般设置为private,但也可以设置为protected以允许子类派生。
 b). Singleton模式一般不要支持拷贝构造函数和Clone接口,因为这有可能导致多个对象实例,与Singleton模式的初衷违背。
 c). 如何实现多线程环境下安全的Singleton?注意对双检查锁的正确实现。

三、代码实现
class Singleton{
private:
	Singleton();
	Singleton(const Singleton& other);
public:
	static Singleton* getInstance();
	static Singleton* m_instance();
};

Singleton* Singleton::m_instance = nullptr;
// 线程非安全版本

Singleton* Singleton::getInstance(){
	if (m_instance == nullptr) {
		m_instance = new Singleton();
	}
	return m_instance;
}
// 线程安全版本,但锁的代价过高

Singleton* Singleton::getInstance(){
	Lock lock;
	if (m_instance == nullptr) {
		m_instance = new Singleton();
	}
}
// 双检查锁,但由于内存读写reorder不安全

Singleton* Singleton::getInstance(){
	if (m_instance == nullptr) {
		Lock lock;
		if (m_instance == nullptr) {
			m_instance == new Singleton();
		}
	}
	return m_instace;
}
// C++11版本之后的跨平台实(Java、C#采用的是加volatile但不能跨平台)
atomic Singleton::instance;
mutex Singleton::m_mutex;
Singleton* Singleton::getInstance(){
	Singleton* tmp = m_instance.load(memory_order_relaxed);
	atomic_thread_fence(memory_order_acquire);		//fence是屏障,获取内存的fence
	if (tmp == nullptr) {
		lock_guard lock(m_mutex);
		tmp = m_instance.load(memory_order_relaxed);
		if (tmp == nullptr) {
			tmp = new Singleton;
			atomic_thread_fence(memory_order_release);	//释放内存的fence
			m_instance.store(tmp, memory_order_relaxed);
		}
	}
	return tmp;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1030491.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号