前段时间使用c++做项目开发,需要根据根据配置文件路径加载全局配置文件,并对外提供唯一访问点。面对这样一个需求,自然的就想到了使用单例模式来创建一个单例配置对象,供外部调用。一开始想使用boost中自带的单例类来实现,但是遗憾的是,boost中的的单例类好像只能使用无参的类构造函数,而我希望将配置文件路径作为单例配置对象的构造函数参数,此外正好借此机会使用c++自己动手实现一个单例类。

  1.线程安全的c++单例类

   实现线程安全的c++单例类,主要要实现以下几点:1)构造函数私有化,即构造函数、拷贝构造函数和复制构造函数定义为private。构造函数私有化是为了防止在类外部定义类对象;拷贝构造函数私有化是为了防止拷贝行为产生多个实例;复制构造函数私有化,防止赋值产生多个实例。  2)提供静态全局访问点,供外部调用访问   3)通过锁机制或者static初始化,保证多线程访问单例对象安全。程序如下:

  清单1:单例类 config.h

 #ifndef _CONFIG_H_
#define _CONFIG_H_
#include <windows.h>
#include <iostream>
using namespace std;
class Config
{
private: //1.构造函数私有
Config()
{
m_path = "config.cfg";
loadGlobalConfig();
}
Config(string path) :m_path(path)
{
loadGlobalConfig();
}
Config(const Config &); //拷贝构造函数不实现,防止拷贝产生多个实例
Config & operator = (const Config &); //复制构造函数不实现,防止赋值产生多个实例
public:
static Config * getInstance() //2.提供全局访问点
{
static Config m_singletonConfig; //3.c++11保证了多线程安全,程序退出时,释放资源
return &m_singletonConfig;
}
void loadGlobalConfig()
{
//std::cout<<"111"<<std::endl;
//Sleep(1000); //休眠1000ms
//std::cout<<"222"<<std::endl;
//加载配置文件......
}
private:
string m_path; //配置文件的路径
};
#endif // _CONFIG_H_

  2. static线程安全测试

    前面提到,c++11保证了static对象在执行构造函数初始化时的线程安全性。对此c++11中的static变量的该特性,我做了一个实验,验证了static类对象的构造函数线程安全性。撤销清单1中28-30行代码的注释,执行main.cpp。main.cpp代码如下: 

  清单2 :main.cpp

 #include "config.h"
#include <thread>
#define THREAD_NUM 2
void gTestStatic()
{
Config *pConf=Config::getInstance();
}
int main()
{
std::thread threadArray[THREAD_NUM];
for (int i=;i<THREAD_NUM;i++)
{
threadArray[i] = std::thread(&gTestStatic);
}
for (int i = ; i < THREAD_NUM; i++)
{
threadArray[i].join(); //主线程等待所有的线程结束
}
return ;
}

  清单3 : 实验结果

 output:

  从这个实验可以看出,一个线程在执行类的构造函数时休眠1ms,另一个线程在等待,因此static对象的构造函数确实只执行了一次。因此,c++11确实保证了static对象构造函数初始化的多线程安全。

c++:自己动手实现线程安全的c++单例类的更多相关文章

  1. Java线程和多线程(五)——单例类中的线程安全

    单例模式是最广泛使用的创建模式之一.在现实世界之中,诸如Databae的连接或者是企业信息系统(EIS)等,通常其创建都是受到限制的,应该尽量复用已存在对象而不是频繁创建销毁.为了达到这个目的,开发者 ...

  2. 【线程安全】—— 单例类双重检查加锁(double-checked locking)

    1. 三个版本单例类的实现 版本1:经典版 public class Singleton { public static Singleton getInstance() { if (instance ...

  3. muduo网络库源码学习————线程本地单例类封装

    muduo库中线程本地单例类封装代码是ThreadLocalSingleton.h 如下所示: //线程本地单例类封装 // Use of this source code is governed b ...

  4. MVC 创建线程内的db单例

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using LSUnion.S ...

  5. iOS-主线程刷新UI【+单例】

    主线程刷新UI dispatch_async(dispatch_get_main_queue(), ^{ /// }); 单例 static Tools *_sharedManger; @implem ...

  6. Spring单例与线程安全小结

    一.Spring单例模式与线程安全   Spring框架里的bean,或者说组件,获取实例的时候都是默认的单例模式,这是在多线程开发的时候要尤其注意的地方. 单例模式的意思就是只有一个实例.单例模式确 ...

  7. C#单例测试(懒汉式双锁保证线程安全)

    单例模式的概念 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 关键点: 这个类只有一个实例,这是最基本的 它必须自行创建 ...

  8. 【转】Spring Bean单例与线程安全

    一.Spring单例模式及线程安全 Spring框架中的Bean,或者说组件,获取实例的时候都是默认单例模式,这是在多线程开发的时候需要尤其注意的地方. 单例模式的意思是只有一个实例,例如在Sprin ...

  9. java双重检测或枚举类实现线程安全单例(懒汉模式)

    双重检测实现 /** * 懒汉模式->双重同步锁单例模式 */ public class SingletonExample5 { private SingletonExample5() { } ...

随机推荐

  1. 深入浅出Redis-Spring整合Redis

    概述: 在之前的博客中,有提到过Redis 在服务端的一些相关知识,今天主要讲一下Java 整合Redis的相关内容. 下面是Jedis 的相关依赖: <dependency> <g ...

  2. 使用docker-compose 大杀器来部署服务 上

    使用docker-compose 大杀器来部署服务 上 我们都听过或者用过 docker,然而使用方式却是仅仅用手动的方式,这样去操作 docker 还是很原始. 好吧,可能在小白的眼中噼里啪啦的对着 ...

  3. 基于fiddler的APP抓包及服务端模拟

    在HTTP接口的测试过程中,一般我们会按照如下的步骤进行: 1)测试环境的准备 2)HTTP消息体的构造 3)HTTP消息的发送及断言 如果我们可以拿到项目组的接口文档,并且HTTP后台服务是可以工作 ...

  4. maven配置文件setting.xml字段注释

    maven的配置文件为settings.xml,在下面路径中可以找到这个文件,分别为: $M2_HOME/conf/settings.xml:全局设置,在maven的安装目录下: ${user.hom ...

  5. 从USB驱动器运行Windows 10

    我相信很多人和我一样.梦想着有个随身携带的U盘版操作系统.无论走到哪里,只要有电脑都可以随时运行自己配置好的操作系统.本篇博文就会一步步的教你如何从USB驱动器加载和运行Windows 10. 让我想 ...

  6. java算法 蓝桥杯(题+答案) 压缩变换

    10.压缩变换  (程序设计) 小明最近在研究压缩算法.他知道,压缩的时候如果能够使得数值很小,就能通过熵编码得到较高的压缩比.然而,要使数值很小是一个挑战. 最近,小明需要压缩一些正整数的序列,这些 ...

  7. 1596: [Usaco2008 Jan]电话网络

    1596: [Usaco2008 Jan]电话网络 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 601  Solved: 265[Submit][S ...

  8. iOS项目之同时点击多个按钮解决方案

    自己的项目完成后,在测试中出现了一个情况,同时点击界面中的多个按钮,会跳转多个界面.然后又看了看别的app,发现也有这样的情况, 如图 上面是我手机上美团app的截图,上面的分类同时选择多个时,只能跳 ...

  9. solr 分词词库管理思路

    solr 分词词库管理思路 大概有以下几种思路: 1. 自定义 SolrRequestHandler        由 SolrRequestHandler 来进行对分词器,进行A)词库加载B)动态添 ...

  10. win8和ubuntu双系统

    硬盘安装的话只要分够内存和做好开机启动项就好了,u盘安装要注意分区(挂载)了推荐: http://wenku.baidu.com/view/5052f19b51e79b8968022623.html ...