-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmacrolib.h
98 lines (83 loc) · 3.12 KB
/
macrolib.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
#ifndef MACROLIB_H
#define MACROLIB_H
#include <pthread.h>
// 生成无参数单例类
#define DECL_SINGLETON_CLASS(klass) \
private: \
klass(); \
static klass *m_inst; \
static pthread_mutex_t m_mutex; \
public: \
static klass *inst();
#define DEFINE_SINGLETON_CLASS(klass) \
klass *klass::m_inst = NULL; \
pthread_mutex_t klass::m_mutex = PTHREAD_MUTEX_INITIALIZER; \
klass::klass() {} \
klass *klass::inst() \
{ \
if (klass::m_inst == NULL) { \
pthread_mutex_lock(&klass::m_mutex); \
if (klass::m_inst == NULL) { \
klass::m_inst = new klass(); \
} \
pthread_mutex_unlock(&klass::m_mutex); \
} \
return klass::m_inst; \
}
// 模板方式实现
// 支持有任意参数的构造函数的单实例类
template<typename T>
class Singleton
{
protected:
// TODO 怎么初始化静态变量呢?
static T *m_inst;
static pthread_mutex_t m_mutex;
public:
virtual ~Singleton()
{
delete m_inst;
m_inst = NULL;
}
public:
[[deprecated("")]]
static T *inst_simple()
{
if (Singleton::m_inst == NULL) {
pthread_mutex_lock(&Singleton::m_mutex);
if (Singleton::m_inst == NULL) {
Singleton::m_inst = new T();
}
pthread_mutex_unlock(&Singleton::m_mutex);
}
return Singleton::m_inst;
}
// 带参数的类行为有点问题。
// need c++11
// inst() with varidic template argument.
template<typename... Arguments>
static T *inst(Arguments... parameters)
{
if (Singleton<T>::m_inst == NULL) {
pthread_mutex_lock(&Singleton<T>::m_mutex);
if (Singleton<T>::m_inst == NULL) {
Singleton<T>::m_inst = new T(/*parameters...*/);
Singleton<T>::m_inst->init(parameters...);
}
pthread_mutex_unlock(&Singleton<T>::m_mutex);
}
return Singleton<T>::m_inst;
}
template<typename... Arguments>
T *init(Arguments... parameters)
{
return Singleton<T>::m_inst;
}
public: // needed for inst()
friend class Singleton; // friend 关系不会继承,子类中还需要这个表达式。
friend T; // 没有什么影响
};
// 模板类静态变量初始化。(必须放在头文件中啊)
template<typename T> T *Singleton<T>::m_inst = NULL;
template<typename T> pthread_mutex_t Singleton<T>::m_mutex = PTHREAD_MUTEX_INITIALIZER;
#endif /* MACROLIB_H */