C++ 九阴真经之线程安全单例类
C++ 九阴真经之线程安全单例类
与之前的单例类似,但普通的单例类是非线程安全的,就是是你不能有些线程读,有些线程写,一般来说,要安全访问单例,就需要用户自己加载来控制对单例的访问。
日常开发中经常会需要加载配置数据,我希望程序运行过程中能够定时的去更新这些配置信息,比如log级别,一般情况下开启INFO级别即可,但处理问题时,我希望打印DEBUG Log。
为了方便起见,这里实现一个线程安全单例,以便以后的项目能够快速的处理这种场景。
代码实现:
//哨兵类,负责多线程操作,自动加锁解锁
//哨兵类不允许拷贝,
template<typename T>
class SingletonGuard : std::unique_lockstd::mutex, public noncopyable
{
public:explicit SingletonGuard(T* inst, std::mutex& mt):std::unique_lockstd::mutex(mt),m_guardPtr(inst){ }SingletonGuard(SingletonGuard<T>&& guard) :m_guardPtr(guard.m_guardPtr){guard.m_guardPtr = nullptr;}T* operator->()const{return m_guardPtr;}
private:T* m_guardPtr;
};
//线程安全单例
template<typename T>
class SingletonSafe : public noncopyable
{
public:static SingletonGuard<T> get_mutable_instance(){return SingletonGuard<T>(&get_instance(), m_signalMutex);}static const T & get_const_instance(){return get_instance();}
private:static T & instance;static void do_nothing(T const &) {}static T & get_instance() {static T ins;do_nothing(instance);return ins;}static std::mutex m_signalMutex;
};
template<typename T>
std::mutex SingletonSafe< T >::m_signalMutex;
template<typename T>
T & SingletonSafe< T >::instance = SingletonSafe< T >::get_instance();
C++ 九阴真经之线程安全单例类相关推荐
- 【线程安全】—— 单例类双重检查加锁(double-checked locking)
1. 三个版本单例类的实现 版本1:经典版 public class Singleton {public static Singleton getInstance() {if (instance == ...
- 游戏设计模式——C++单例类
前言: 本文将探讨单例类设计模式,单例类的懒汉模式/饿汉模式,单例类的多线程安全性,最后将利用C++模板减少单例类代码量. 本文假设有一个Manager管理类,并以此为探究单例类的设计模式. 懒汉模式 ...
- java-Transient关键字、Volatile关键字介绍和序列化、反序列化机制、单例类序列化
- Transient关键字 Java的serialization提供了一种持久化对象实例的机制.当持久化对象时,可能有一个特殊的对象数据成员,我们不想 用serialization机制来保存它.为 ...
- (七)boost库之单例类
一.boost.serialzation的单件实现 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问 ...
- c++实现单例类(懒汉与饿汉)
教科书里的单例模式 我们都很清楚一个简单的单例模式该怎样去实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实例的 ...
- java中单例设计模式登记式单例类_java23种设计模式-创建型模式之单例模式
单例模式(Singleton) 单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比较频 ...
- 设计模式详解:Singleton(单例类)
Singleton(单例类) 设计模式学习:概述 意图 保证每一个类仅有一个实例,并为它提供一个全局访问点. 顾名思义,单例类Singleton保证了程序中同一时刻最多存在该类的一个对象. 有些时候, ...
- 单例模式及单例类的两种实现
单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在 ...
- Android学习-Kotlin语言入门-变量、函数、语法糖、when、for-in、主构造函数、单例类、函数式API、集合遍历、隐式Intent、Activity生命周期、四种启动模式、标准函数
探究java语言的运行机制 变量.函数.语法糖 when条件语句 for循环 主构造函数.次构造函数 数据类和单例类 集合的创建与遍历 集合的函数式API 创建菜单 隐式使用Intent Activi ...
最新文章
- 学习成长就到鸿蒙思维,庆国庆,迎中秋,鸿蒙教育享双节99元开启思维之旅!!...
- 2021算法竞赛入门班第九节课【线段树】练习题
- html字体渐变颜色的设置颜色代码,使用CSS3实现字体颜色渐变的实现
- c语言加密shell脚本,shell脚本加密
- 懒人建站 前台设计及特效
- poj 3087 Shuffle'm Up 模拟(map记录)
- java连接zookeeper服务器出现“KeeperErrorCode = ConnectionLoss for ...”
- container_of的用法
- 10个典型的大数据案例
- Go语言Web开发Revel框架搭建
- Detecting Deep-Fake Videos from Appearance and Behavior
- 施德来:有赞电商小程序的实践
- dede标签调用大全
- 【总结】美团之推荐系统
- [转帖]彩色硬盘 关于西数硬盘 企业盘、黑盘、蓝盘、绿盘、红盘的区别
- iOS 数据库-SQLite3 CoreData FMDB
- swfobject.js 详细解说
- 如何解决word文档报错打不开呢?
- SAP ABAP 模糊查询
- CNN经典模型整理Lenet,Alexnet,Googlenet,VGG,Deep Residual Learning,squeezenet