三沣开发知识 购物 网址 游戏 小说 歌词 地图 快照 股票 美女 新闻 笑话 | 汉字 软件 日历 阅读 下载 图书馆 开发 租车 短信 China
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题
autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程 CSS/HTML/Xhtml
html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
站长资讯 .NET新手 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA VisualStudio ASP.NET-MVC .NET控件开发 EntityFramework WinRT-Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动 Html-Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP OracleERP DynamicsCRM K2 BPM 信息安全 企业信息 Android开发 iOS开发 WindowsPhone WindowsMobile 其他手机 敏捷开发 项目管理 软件工程 SQLServer Oracle MySQL NoSQL 其它数据库 Windows7 WindowsServer Linux
  IT知识库 -> C++ -> c++:自己动手实现线程安全的c++单例类 -> 正文阅读
 

[C++]c++:自己动手实现线程安全的c++单例类

c++:自己动手实现线程安全的c++单例类   前段时间使用c++做项目开发,需要根据根据配置文件路径加载全局配置文件,并对外提供唯一访问点。面对这样一个需求,自然的就想到了使用单例模式来创建一个单例配置对象,供外部调用。一开始想使用boost中自带的单例类来实现,但是遗憾的是,boost中的的单例类好像只能使用无参的类构造函数,而我希望将配置文件路径作为单例配置对象的构造函数参数,此外正好借此机会使用c++自己动手实现一个单例类。
  1.线程安全的c++单例类
   实现线程安全的c++单例类,主要要实现以下几点:1)构造函数私有化,即构造函数、拷贝构造函数和复制构造函数定义为private。构造函数私有化是为了防止在类外部定义类对象;拷贝构造函数私有化是为了防止拷贝行为产生多个实例;复制构造函数私有化,防止赋值产生多个实例。  2)提供静态全局访问点,供外部调用访问   3)通过锁机制或者static初始化,保证多线程访问单例对象安全。程序如下:
  清单1:单例类 config.h

 1 #ifndef _CONFIG_H_
 2 #define _CONFIG_H_
 3 #include <windows.h>
 4 #include <iostream>
 5 using namespace std;
 6 class Config
 7 {
 8 private:     //1.构造函数私有
 9     Config()
10     {
11         m_path = "config.cfg";
12         loadGlobalConfig();
13     }
14     Config(string path) :m_path(path) 
15     {
16         loadGlobalConfig();
17     }
18     Config(const Config &);   //拷贝构造函数不实现,防止拷贝产生多个实例
19     Config & operator =  (const Config &);  //复制构造函数不实现,防止赋值产生多个实例
20 public:
21     static Config * getInstance()    //2.提供全局访问点
22     {
23         static Config m_singletonConfig;    //3.c++11保证了多线程安全,程序退出时,释放资源
24         return &m_singletonConfig;
25     }
26     void loadGlobalConfig()
27     {
28         //std::cout<<"111"<<std::endl;
29         //Sleep(1000);   //休眠1000ms
30         //std::cout<<"222"<<std::endl;
31         //加载配置文件......
32     }
33 private:
34     string m_path;    //配置文件的路径
35 };
36 #endif // _CONFIG_H_

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

 1 #include "config.h"
 2 #include <thread>
 3 #define THREAD_NUM 2
 4 void gTestStatic()
 5 {
 6     Config *pConf=Config::getInstance();
 7 }
 8 int main()
 9 {
10     std::thread threadArray[THREAD_NUM];   
11     for (int i=0;i<THREAD_NUM;i++)
12     {
13         threadArray[i] = std::thread(&gTestStatic);
14     }
15     for (int i = 0; i < THREAD_NUM; i++)
16     {
17         threadArray[i].join();    //主线程等待所有的线程结束
18     }
19     return 0;
20 }

  清单3 : 实验结果

1 output:
2             111
3             222

  从这个实验可以看出,一个线程在执行类的构造函数时休眠1ms,另一个线程在等待,因此static对象的构造函数确实只执行了一次。因此,c++11确实保证了static对象构造函数初始化的多线程安全。
  C++ 最新文章
关于poin与references
019:别叫,这个大整数已经很简化了!
c++智能指针详解
BZOJ1269: [AHOI2006]文本编辑器editor
洛谷P3835 【模板】可持久化平衡树
洛谷P2925 [USACO08DEC]干草出售Hay For Sa
二叉搜索树与双向链表
C++的内存泄漏检测【转载】
C++重载流插入运算符和流提取运算符【转】
统计页码数字0~9分别出现了多少次
上一篇文章      下一篇文章      查看所有文章
加:2017-04-17 01:53:01  更:2017-05-15 14:07:53 
 
技术频道: 站长资讯 .NET新手区 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA Visual Studio ASP.NET MVC .NET控件开发 Entity Framework WinRT/Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动设计 Html/Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP Oracle ERP Dynamics CRM K2 BPM 信息安全 企业信息化其他 Android开发 iOS开发 Windows Phone Windows Mobile 其他手机开发 敏捷开发 项目与团队管理 软件工程其他 SQL Server Oracle MySQL NoSQL 其它数据库 Windows 7 Windows Server Linux
脚本语言: vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程
网站开发: CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
360图书馆 软件开发资料 文字转语音 购物精选 软件下载 美食菜谱 新闻资讯 电影视频 小游戏 Chinese Culture 股票 租车
生肖星座 三丰软件 视频 开发 短信 中国文化 网文精选 搜图网 美图 阅读网 多播 租车 短信 看图 日历 万年历 2017年12日历
2017-12-17 17:58:21
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT知识库