-
Notifications
You must be signed in to change notification settings - Fork 1
/
Singleton.h
123 lines (100 loc) · 2.73 KB
/
Singleton.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/******************************************************************************
作者: 何登锋
功能说明:
单件类封装。如果你需要定义一个单件类,就可以使用该文件提供服务,它可以帮你解决多线程问题,资
源释放问题,这些代码的实现基本上是标准的单件实现,如果你看不懂,相关资料非常多,请自行找资料
了解。
******************************************************************************/
#ifndef _SINGLETON_H
#define _SINGLETON_H
#include <memory>
#include<mutex>
using namespace std;
template <typename T>
class Singleton
{
public:
// two common methods for getting instance of singleton class.
static T *instance();
static T *instance(void *arg);
private:
Singleton(){}//do nothing
~Singleton(){}
static std::auto_ptr<T> _instance; // 它会自动释放对象。
static std::recursive_mutex _mutex;
};
/******************************************************************************
作者:何登锋
功能描述:
参数说明:
返回值:
******************************************************************************/
template <typename T>
std::auto_ptr<T> Singleton<T>::_instance;
/******************************************************************************
作者:何登锋
功能描述:
参数说明:
返回值:
******************************************************************************/
template <typename T>
recursive_mutex Singleton<T>::_mutex;
/******************************************************************************
作者:何登锋
功能描述:
得到一个对象。
参数说明:
返回值:
******************************************************************************/
template <typename T>
inline T *Singleton<T>::instance()
{
T *object = NULL;
if(_instance.get() == NULL)
{
_mutex.lock();
if(_instance.get() == NULL)
{
//Mdebug("instance.reset(new T)\n");
_instance.reset(new T);
}
_mutex.unlock();
object = _instance.get();
}
else
{
object = _instance.get();
}
return object;
}
/******************************************************************************
作者:何登锋
功能描述:
得到一个对象。
参数说明:
返回值:
******************************************************************************/
template <typename T>
inline T *Singleton<T>::instance(void *arg)
{
T *object = NULL;
if(_instance.get() == NULL)
{
_mutex.lock();
if(_instance.get() == NULL)
{
_instance.reset(new T(arg));
}
_mutex.unlock();
object = _instance.get();
}
else
{
object = _instance.get();
}
return object;
}
#define DECLARE_SINGLETON_CLASS(type) \
friend class std::auto_ptr<type>; \
friend class Singleton<type>
#endif