码迷,mamicode.com
首页 > 编程语言 > 详细

模板singleton模式的C++实现

时间:2016-11-21 18:36:05      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:http   实例   private   blog   eve   模板类   library   127.0.0.1   res   

模板singleton模式的C++实现

  近期回过头整理了一下singleton模式,看了别人写的关于singleton的介绍。发现这个singleton模式虽然简单,但要写一个稳定/线程安全/泛型的模板singleton,还是需要一点技巧的。经过整理,要写一个模板的singlton至少需要以下几个知识点:

1:singleton

2:static类成员实例延迟创建。

3:static类实例创建互斥实现,即线程安全。

4:double check技巧。  【Ref:http://www.ibm.com/developerworks/library/j-dcl/index.html】

5:模板。

6:static成员变量初始化。

7:singleton关闭类实例

下面上singleton实现代码,测试可用。

 1 #pragma once
 2 /************************************************************************
 3 singleton模式类模板
 4 1:延迟创建类实例    2:double check    3:互斥访问    4:模板
 5 ************************************************************************/
 6 #ifndef WHG_SINGLETON
 7 #define WHG_SINGLETON
 8 
 9 #include "ThreadLockCs.h"
10 
11 template<class T>
12 class CSingleton
13 {
14 private:
15     static T* _instance;
16     CSingleton(void);
17     static CThreadLockCs lcs;
18 public:
19     static T* Instance(void);
20     static void Close(void);
21 };
22 
23 //模板类static变量
24 template<class T> 
25 T*  CSingleton<T>::_instance = NULL;
26 
27 template<class T> 
28 CThreadLockCs CSingleton<T>::lcs;
29 
30 //模板类方法实现
31 template<class T>
32 CSingleton<T>::CSingleton(void)
33 {    
34 }
35 
36 template<class T>
37 T*  CSingleton<T>::Instance(void)
38 {
39     //double-check
40     //延迟创建,只有调用方访问Instance才会创建类实例
41     if (_instance == NULL)
42     {
43         //互斥访问锁,用CriticalSection实现
44         lcs.lock();
45         if (_instance == NULL)
46         {
47             _instance = new T;
48         }
49         lcs.unlock();
50     }
51     return _instance;
52 }
53 
54 template<class T>
55 void CSingleton<T>::Close(void)
56 {
57     if (_instance)
58     {
59         delete _instance;
60     }
61 }
62 
63 #endif

 

CSingleton内用到的CThreadLockCs 实现如下:

 1 //互斥访问锁
 2 #ifndef WHG_THREAD_LOCKCS
 3 #define WHG_THREAD_LOCKCS
 4 
 5 //#include <Windows.h>
 6 
 7 class CThreadLockCs
 8 {
 9 public:
10     CThreadLockCs(){InitializeCriticalSection(&m_cs);}
11     ~CThreadLockCs(){DeleteCriticalSection(&m_cs);}
12     void lock(){EnterCriticalSection(&m_cs);}
13     void unlock(){LeaveCriticalSection(&m_cs);}
14 private:
15     CRITICAL_SECTION m_cs;
16 };
17 #endif

 

调用方法很简单:

1:用typedef申明一个变量名

1 typedef CSingleton<CListen>    LISTEN;

 

2:调用的地方写

1 LISTEN::Instance()->SetAddress(8828,"127.0.0.1");

 

3:关闭的地方写

1 LISTEN::Close();

 

模板singleton模式的C++实现

标签:http   实例   private   blog   eve   模板类   library   127.0.0.1   res   

原文地址:http://www.cnblogs.com/hgwang/p/6085922.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!