-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy paththread.h
More file actions
282 lines (235 loc) · 5.4 KB
/
thread.h
File metadata and controls
282 lines (235 loc) · 5.4 KB
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
//
// Created by lecai on 13-11-20.
//
#ifndef __thread_H_
#define __thread_H_
#include "platform.h"
#include <list>
#include <vector>
#include <string>
#include <sys/_types/_pthread_cond_t.h>
#include <sys/_types/_pthread_mutex_t.h>
#include <sys/_types/_pthread_rwlock_t.h>
#include <sys/_types/_pthread_t.h>
#define MY_HANDLE pthread_t
#define MY_API
#define MY_MUTEX_HANDLE pthread_mutex_t
#define MY_COND_HANDLE pthread_cond_t
#define MY_RW_LOCK_HANDLE pthread_rwlock_t
/*
声明类集合
*/
namespace thread{
class Mutex; //锁对象
class Mutex_scope_lock; //锁操作类
class Cond ; //线程系统条件变量
class RWLock ; //读写锁
class RWLock_scope_rdlock; //读锁操作类
class Thread;
};
namespace thread{
class Mutex{
public:
/*
* @brief 构造函数 构造一个互斥体对象
*/
Mutex();
/*
* @brief 析构函数
*/
~Mutex();
/*
* 加锁一个互斥体
*/
inline void lock();
/*
* 解锁一个互斥体
*/
inline void unlock();
MY_MUTEX_HANDLE m_hMutex; //互斥体对象
};
/*
* 方便复杂函数中锁的使用
*/
class Mutex_scope_lock{
public:
/*
* 构造函数
* 对锁进行lock操作
* @param m 锁的引用
*/
Mutex_scope_lock(Mutex &m);
/*
* 析构函数
* 对锁进行unlock操作
* @param m 锁引用
*/
~Mutex_scope_lock();
Mutex &m_Mutex; //锁对象
};
/*
* 封装系统的读写锁,去除繁杂的手工初始化 和销毁的操作
*/
class RWLock{
public:
/*
* 构造函数
* 创建一个读写锁
*/
RWLock();
/*
* 析构函数
* 销毁一个读写锁
*/
~RWLock();
/*
* 对读写锁 读操作 进行加锁操作
*
*/
inline void rdlock();
/*
* 对读写锁 写操作 进行加锁操作
*/
inline void wrlock();
/*
* 对读写锁 进行解锁操作
*/
inline void unlock();
private:
MY_RW_LOCK_HANDLE m_hMutex; //系统读写锁
unsigned int rd_count;
unsigned int wr_count;
};
class RWLock_scope_rdlock{
public:
/*
* 构造函数
* 对读写锁进行 rdlock 操作
* @param m 读写锁引用
*/
RWLock_scope_rdlock(RWLock &m);
/*
* 析构函数
* 对读写锁进行 unlock 操作
*/
~RWLock_scope_rdlock();
private:
RWLock &m_RwLock; //读写锁引用
};
class RWLock_scope_wrlock{
public:
/*
* 构造函数
* 对读写锁进行 wrlock 操作
* @param m 读写锁引用
*/
RWLock_scope_wrlock(RWLock &m);
/*
* 析构函数
* 对读写锁进行 unlock 操作
*/
~RWLock_scope_wrlock();
private:
RWLock &m_RwLock; //读写锁引用
};
/*
* 封装系统条件变量 省去手工初始化 和 销毁的繁琐工作
*/
class Cond{
public:
/*
* 构造函数 用于创建一个系统条件变量
*/
Cond();
/*
* 析构函数 用于销毁一个系统条件变量
*/
~Cond();
/*
* 对所有等待这个条件变量的线程 广播信号,使这些线程能继续向下执行下去
*/
void broadcast();
/*
* 对所有等待这个条件变量的线程 发送信号,使这些线程继续向下执行下去
*/
void signal();
/*
* 等待特定的条件变量满足
* @param m 需要等待的互斥体
*/
void wait(Mutex &m);
private:
MY_COND_HANDLE m_hEvent; //系统条件变量
};
class Thread{
public:
/*
* 构造函数 创建一个对象
* @param name 线程名称
* @param joinable 标明此线程退出时 是否保存状态 true 保存 false 不保存
*/
Thread(const std::string &name = std::string("lThread"), bool joinable = true);
/*
* 析构函数 用于销毁一个对象 获取释放的空间
*/
virtual ~Thread();
/*
* 让线程睡眠指定的时间 秒
* @param sec 指定时间 秒
*/
static void sleep(const long sec);
/*
* 让线程睡眠指定的时间 毫秒
* @param msec 指定时间 毫秒
*/
static void msleep(const long msec);
/*
* 让线程睡眠指定的时间 微秒
* @param usec 指定时间 微秒
*/
static void usleep(const long usec);
/*
* 是否保存状态
* @return 是否保存
*/
const bool isJoinable() const ;
/*
* 检查线程是否在运行状态
* @return 是否在运行
*/
const bool isAlive() const ;
/*
*/
static void *threadFunc(void *arg);
bool start();
void join();
/*
* 主动结束线程
* 设置标志 , 当线程的run 主回调循环的时候遇到这个标志被设置的时候 退出循环
*/
void final();
/*
* 判断线程是否继续执行下去
* @return 标志
*/
const bool isFinal() const ;
/*
* 纯虚函数 线程主回调函数
* 如果是无限循环 则在每个循环中 都要检查isFinal 这样保证线程安全退出
*/
virtual void run() = 0;
/*
* 返回线程名称
*/
const std::string &getThreadName() const ;
public:
std::string threadName; //线程名称
Mutex m_Lock;//互斥锁
volatile bool alive;//线程是否在进行
volatile bool complete;
MY_HANDLE m_hThread;//线程编号
bool joinable;//线程标志
Cond m_Cond;
};
}
#endif //__thread_H_