前言

说到单例模式,很多人可能都已经很熟悉了,这也是面试常问的一个问题。对于单线程而言,单例的实现非常简单,而要写出一个线程安全的单例模式,曾经有很多种写法。有兴趣的可以参考这篇文章《单例模式很简单?但是你真的能写对吗?》

简单实现

该文章中也提到,由于C++11及以后的版本中,默认静态变量初始化是线程安全的。

The initialization of such a variable is defined to occur the first time control passes through its declaration; for multiple threads calling the function, this means there’s the potential for a race condition to define first.

写法如下:

//来源:公众号编程珠玑//作者:守望先生class Singleton{public:    static Singleton& getInstance(){        static Singleton m_instance;  //局部静态变量        return m_instance;    }    Singleton(const Singleton& other) = delete;    Singleton& operator=(const Singleton& other) = delete;protected:    Singleton() = default;    ~Singleton() = default;};

这里需要注意将其他构造函数设置为delete。避免对象被再次构造或者拷贝。

这种单例被称为Meyers' Singleton。

通用化

当然为了避免给每个对象都单独写个单例,也可以利用模板。

template<typename T>class Singleton{public:    static T& getInstance() {        static T t;        return t;    }

    Singleton(const Singleton&) = delete;     Singleton& operator=(const Singleton&) = delete; protected:    Singleton() = default;    ~Singleton() = default;};

示例

举个简单的例子来看下吧:

//来源:公众号编程珠玑//作者:守望先生#includetemplate<typename T>class Singleton{public:    static T& getInstance() {        static T t;        return t;    }

    Singleton(const Singleton&) = delete;     Singleton& operator=(const Singleton&) = delete; protected:    Singleton() = default;    ~Singleton() = default;};class Test:public Singleton{public:void myprint(){std::cout<<"test Singleton"<<std::endl;    }};int main(){    Test::getInstance().myprint();return 0;}

编译运行:

$ g++ -o test test.cc -std=c++11$ ./testtest Singleton

另一种用法

当然你也可以像下面这样使用:

class Test{public:    void myprint(){        std::cout<<"test Singleton"<<std::endl;    }};int main(){    Singleton::getInstance().myprint();return 0;}

转载自网络

std string与线程安全_这才是现代C++单例模式简单又安全的实现相关推荐

  1. std string与线程安全_详解linux系统中断线程的那些事

    很多情况下,使用信号来终止一个长时间运行的线程是合理的.这种线程的存在,可能是因为工作线程所在的线程池被销毁,或是用户显式的取消了这个任务,亦或其他各种原因.不管是什么原因,原理都一样:需要使用信号来 ...

  2. std string与线程安全_C++标准库多线程简介Part1

    Part1:线程与互斥量 本篇文章将简单的介绍一下C++的标准线程库,本篇内容十分基础,如果你有C++多线程相关的使用经验或者知识,就不必在这篇文章上浪费时间了... 如果你认为本篇文章对你有帮助,请 ...

  3. std string与线程安全,是std :: regex线程安全吗?

    Related to Is a static boost::wregex instance thread-safe? but for the standarized version. Can I ca ...

  4. C++中std::string::find_last_of用法

    早上本来还看代码时本来还迷迷糊糊,结果被find_last_of一下给震醒了,std::string 使用了这么多年,今天才发现find_last_of只是用来查找字符的,多年来一直以为它可用来查找字 ...

  5. [C/C++标准库]_[0基础]_[怎样实现std::string自己的Format(sprintf)函数]

    场景: 1.  C语言有自己的sprintf函数,可是这个函数有个缺点,就是不知道须要创建多大的buffer, 这时候能够使用snprintf函数来计算大小,仅仅要參数 buffer为NULL, co ...

  6. std string 编码_【星云测试】Wings企业级单元测试自动编码引擎白皮书

    第一章 Wings企业级单元测试自动编码引擎诞生的背景 随着科技的飞速发展,软件系统越来越复杂,在系统测试阶段不断遇到的瓶颈,迫使行业逐步追根溯源到了单元测试阶段.软件缺陷发现得越晚,其处理费用就越呈 ...

  7. c++ string最大长度_关于C++ std::string类内存布局的探究

    一切要从探讨指针的类型说起. 运行环境:Ubuntu 20.04.1 LTS 64-bit 预先准备:调整字节对齐单位为1,防止为4时因填充导致人脑判断失误 #pragma pack(1) 01 - ...

  8. 转: std::string用法详解

    原文地址为: 转: std::string用法详解  C++中的string 类 简单介绍 前言: string 的角色 1 string 使用 1.1 充分使用string 操作符 1.2 眼花缭乱 ...

  9. 【报错】关于[Error] cannot bind non-const lvalue reference of type ‘std::String‘ to an rvalue……的一个解决方案

    使用dev c++进行一波教科书代码的练习时出现了一点问题,于是来记录一波. 报错信息如下: [Error] cannot bind non-const lvalue reference of typ ...

最新文章

  1. python基础-变量运算符(3)
  2. ant app 心电监测_医疗级心电健康手表,随时随地监测你的健康,心电手表H1手表评测...
  3. IOS学习笔记二十三对象归档(NSKeyedArchiver、NSKeyedUnArchiver、NSCodeing)
  4. 手写分页 个人感觉还能优化,甚至抽象出来,需要高手讲解
  5. java编写龟兔赛跑_java--龟兔赛跑模拟
  6. SCAU高级语言程序设计--实验5 循环结构(一)(2)
  7. 计算机无法添加本地策略组,win7本地组策略编辑器不能编辑怎么解决
  8. C300 OLT自动下发WAN连接指导配置
  9. 梁念坚:“云计算”福音
  10. 牛客网《剑指offer》专栏刷题练习|锻炼递归思想|练习栈的使用
  11. C语言中文网_java复习进度
  12. 设计师都在用的素材网站,真的纯免费,还能商用
  13. golang的ping检测主机存活
  14. android应用和苹果,同一款软件,在安卓和苹果间差别原来这么大
  15. 程序员面试必备软技能,值得收藏!
  16. 强化学习之 PPO 算法
  17. 智慧城市 低功耗物联网技术与应用并进
  18. 《Parcel打包工具的使用》
  19. IE6/IE7/IE8/FF兼容问题汇总,以及解决方案
  20. 微信发出消息后,消息走过哪些路

热门文章

  1. 谷歌升级Android分析应用程序
  2. 内存中的rank跟bank有什么区别
  3. 如何在DNN模块中插入一个图片--在模块中引用资源文件
  4. MongoRepository
  5. FTP命令行使用精粹
  6. QDU第一届程序设计大赛——E到I题解法(非官方题解)
  7. JAVA高精度计算工具
  8. Android初学第34天
  9. shiro实战系列(八)之安全管理器
  10. 遍历页面上所有的textBox