c++线程池,继承CDoit,实现其中的start和end
头文件
?
|
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
|
/*
* 多线程管理类
*
*/
#ifndef CTHREADPOOLMANAGE_H
#define CTHREADPOOLMANAGE_H
#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <list>
#include <vector>
#include <time.h>
#include <asm/errno.h>
#define USLEEP_TIME 100
#define CHECK_TIME 1
using namespace std;
class CDoit
{
public:
virtual int start(void *){};
virtual int end(){};
};
class CthreadPoolManage
{
private:
int _minThreads; //最少保留几个线程
int _maxThreads; //最多可以有几个线程
int _waitSec; //空闲多少秒后将线程关闭
class threadInfo{
public:
threadInfo(){
isbusy = false;
doFlag = true;
}
//
pthread_mutex_t mtx=PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond=PTHREAD_COND_INITIALIZER;
bool isbusy; //是否空闲
bool doFlag;
//
time_t beginTime; //线程不工作开始时间
pthread_t cThreadPid; //线程id
pthread_attr_t cThreadAttr; //线程属性
CDoit * doit; //任务类
void * value; //需要传递的值
};
//线程函数
static void* startThread(void*);
//任务队列锁
pthread_mutex_t _duty_mutex;
//任务队列
list<threadInfo*> _dutyList;
//线程队列锁
pthread_mutex_t _thread_mutex;
//线程队列
list<threadInfo*> _threadList;
///初始化,创建最小个数线程///
void initThread();
///任务分配线程///
static void* taskAllocation(void*arg);
pthread_t tasktPid;
///线程销毁、状态检查线程///
static void* checkThread(void* arg);
pthread_t checktPid;
bool checkrun;
//线程异常退出清理
static void threadCleanUp(void* arg);
//
int addThread(list<threadInfo*> *plist,threadInfo* ptinfo);
public:
CthreadPoolManage();
/*
保留的最少线程,最多线程数,空闲多久销毁,保留几个线程的冗余
*/
CthreadPoolManage(int min,int max,int waitSec);
~CthreadPoolManage();
int start();
//任务注入器
int putDuty(CDoit *,void *);
int getNowThreadNum();
};
#endif // CTHREADPOOLMANAGE_H
|
CPP文件
?
|
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
|
