前段时间使用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. MySQL 5.7 安装完成后,立即要调整的性能选项

    原文:MySQL 5.7 Performance Tuning Immediately After Installation 本文是对上一篇<安装 MySQL 后,需要调整的 10 个性能配置项 ...

  2. jQ试题的总结

    jQuery习题的一些总结   1.在div元素中,包含了一个<span>元素,通过has选择器获取<div>元素中的<span>元素的语法是? 提示使用has $ ...

  3. weui.css中flex容器下子项目的水平和垂直居中

    想用weui.css写微信平台的页面,发现没有让flex(weui-flex)容器下,子项目(weui-flex__item)居中的类. 百度了一下,是用justify-content:center; ...

  4. wemall软件交易平台微信图文编辑器部分代码分享

    wemall软件交易平台微信图文编辑器部分代码,可下载: controller.php <?php date_default_timezone_set("Asia/chongqing& ...

  5. 1121: [POI2008]激光发射器SZK

    1121: [POI2008]激光发射器SZK Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 574  Solved: 475[Submit][Sta ...

  6. swift -- 单例

    方式一: (类似OC) class SingletonDispatch{ class var shareInstance : SingletonDispatch { //结构体 struct Stat ...

  7. Druid连接池配置(java无框架)

    连接池是一个对数据库连接进行管理的东西,当一个线程需要用 JDBC 对 数据库操作时,它从池中请求一个连接.当这个线程使用完了这个连接,将它返回到连接池中,这样这就可以被其它想使用它的线程使用,而不是 ...

  8. 如何在appconfig中配置服务的ip

    开发了一个WindowsService消息服务器,刚开始一直都是在代码中把IP地址写死,所以每次只要是更换了新的IP地址后,都需要重新编译项目.所以考虑把ip配置到config文件中, 这样做的好处是 ...

  9. 菜鸟聊JavaScript中this

    菜鸟聊this this在JavaScript中是一个比较头疼的问题,我现在以一枚菜鸟的观点结合代码简单的谈下JavaScript中的this指向问题. 1.例子1 function a() { va ...

  10. SEVERE: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener错误

    错误信息:SEVERE: Error configuring application listener of class org.springframework.web.context.Context ...