std string与线程安全_这才是现代C++单例模式简单又安全的实现
前言
说到单例模式,很多人可能都已经很熟悉了,这也是面试常问的一个问题。对于单线程而言,单例的实现非常简单,而要写出一个线程安全的单例模式,曾经有很多种写法。有兴趣的可以参考这篇文章《单例模式很简单?但是你真的能写对吗?》
简单实现
该文章中也提到,由于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++单例模式简单又安全的实现相关推荐
- std string与线程安全_详解linux系统中断线程的那些事
很多情况下,使用信号来终止一个长时间运行的线程是合理的.这种线程的存在,可能是因为工作线程所在的线程池被销毁,或是用户显式的取消了这个任务,亦或其他各种原因.不管是什么原因,原理都一样:需要使用信号来 ...
- std string与线程安全_C++标准库多线程简介Part1
Part1:线程与互斥量 本篇文章将简单的介绍一下C++的标准线程库,本篇内容十分基础,如果你有C++多线程相关的使用经验或者知识,就不必在这篇文章上浪费时间了... 如果你认为本篇文章对你有帮助,请 ...
- std string与线程安全,是std :: regex线程安全吗?
Related to Is a static boost::wregex instance thread-safe? but for the standarized version. Can I ca ...
- C++中std::string::find_last_of用法
早上本来还看代码时本来还迷迷糊糊,结果被find_last_of一下给震醒了,std::string 使用了这么多年,今天才发现find_last_of只是用来查找字符的,多年来一直以为它可用来查找字 ...
- [C/C++标准库]_[0基础]_[怎样实现std::string自己的Format(sprintf)函数]
场景: 1. C语言有自己的sprintf函数,可是这个函数有个缺点,就是不知道须要创建多大的buffer, 这时候能够使用snprintf函数来计算大小,仅仅要參数 buffer为NULL, co ...
- std string 编码_【星云测试】Wings企业级单元测试自动编码引擎白皮书
第一章 Wings企业级单元测试自动编码引擎诞生的背景 随着科技的飞速发展,软件系统越来越复杂,在系统测试阶段不断遇到的瓶颈,迫使行业逐步追根溯源到了单元测试阶段.软件缺陷发现得越晚,其处理费用就越呈 ...
- c++ string最大长度_关于C++ std::string类内存布局的探究
一切要从探讨指针的类型说起. 运行环境:Ubuntu 20.04.1 LTS 64-bit 预先准备:调整字节对齐单位为1,防止为4时因填充导致人脑判断失误 #pragma pack(1) 01 - ...
- 转: std::string用法详解
原文地址为: 转: std::string用法详解 C++中的string 类 简单介绍 前言: string 的角色 1 string 使用 1.1 充分使用string 操作符 1.2 眼花缭乱 ...
- 【报错】关于[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 ...
最新文章
- python基础-变量运算符(3)
- ant app 心电监测_医疗级心电健康手表,随时随地监测你的健康,心电手表H1手表评测...
- IOS学习笔记二十三对象归档(NSKeyedArchiver、NSKeyedUnArchiver、NSCodeing)
- 手写分页 个人感觉还能优化,甚至抽象出来,需要高手讲解
- java编写龟兔赛跑_java--龟兔赛跑模拟
- SCAU高级语言程序设计--实验5 循环结构(一)(2)
- 计算机无法添加本地策略组,win7本地组策略编辑器不能编辑怎么解决
- C300 OLT自动下发WAN连接指导配置
- 梁念坚:“云计算”福音
- 牛客网《剑指offer》专栏刷题练习|锻炼递归思想|练习栈的使用
- C语言中文网_java复习进度
- 设计师都在用的素材网站,真的纯免费,还能商用
- golang的ping检测主机存活
- android应用和苹果,同一款软件,在安卓和苹果间差别原来这么大
- 程序员面试必备软技能,值得收藏!
- 强化学习之 PPO 算法
- 智慧城市 低功耗物联网技术与应用并进
- 《Parcel打包工具的使用》
- IE6/IE7/IE8/FF兼容问题汇总,以及解决方案
- 微信发出消息后,消息走过哪些路