acl  3.5.3.0
acl_pthread_pool.h
浏览该文件的文档.
1 #ifndef ACL_PTHREAD_POOL_INCLUDE_H
2 #define ACL_PTHREAD_POOL_INCLUDE_H
3 
4 #include "../stdlib/acl_define.h"
5 #include <time.h>
6 
7 #ifdef ACL_UNIX
8 #include <pthread.h>
9 #endif
10 
11 #ifdef __cplusplus
12 extern "C" {
13 #endif
14 
16 
17 /**
18  * 创建一个线程池的工作任务
19  * @param run_fn {void (*)(void*)} 在子线程中被调用的回调函数
20  * @param run_arg {void*} run_fn 的回调参数之一
21  * @param fixed {int}
22  * @return {acl_pthread_job_t*} 返回创建的工作任务
23  */
24 ACL_API acl_pthread_job_t *acl_pthread_pool_alloc_job(void (*run_fn)(void*),
25  void *run_arg, int fixed);
26 
27 /**
28  * 释放由 acl_pthread_pool_alloc_job 创建的工作任务
29  * @param job {acl_pthread_job_t*}
30  */
32 
33 /**
34  * 线程池对象结构类型定义
35  */
37 
38 /**
39  * 线程池对象属性的结构类型定义
40  */
41 typedef struct acl_pthread_pool_attr_t {
42  int threads_limit; /**< 线程池最大线程数限制 */
43 #define ACL_PTHREAD_POOL_DEF_THREADS 100 /**< 缺省最大值为 100 个线程 */
44  int idle_timeout; /**< 工作线程空闲超时时间(秒) */
45 #define ACL_PTHREAD_POOL_DEF_IDLE 0 /**< 缺省空间超时时间为 0 秒 */
46  size_t stack_size; /**< 工作线程的堆栈大小(字节) */
48 
49 /**
50  * 更简单地创建线程对象的方法
51  * @param threads_limit {int} 线程池中最大并发线程数
52  * @param idle_timeout {int} 工作线程空闲超时退出时间(秒)
53  * @return {acl_pthread_pool_t*}, 如果不为空则表示成功,否则失败
54  */
56  int threads_limit, int idle_timeout);
57 
58 /**
59  * 创建一个线程池对象
60  * @param attr {acl_pthread_pool_attr_t*} 线程池创建时的属性,如果该参数为空,
61  * 则采用默认参数: ACL_PTHREAD_POOL_DEF_XXX
62  * @return {acl_pthread_pool_t*}, 如果不为空则表示成功,否则失败
63  */
65  const acl_pthread_pool_attr_t *attr);
66 
67 /**
68  * 当队列堆积的任务数大于空闲线程数的2倍时. 通过此函数设置添加任务的
69  * 线程休眠时间, 如果不调用此函数进行设置, 则添加线程不会进入休眠状态.
70  * @param thr_pool {acl_pthread_pool_t*} 线程池对象,不能为空
71  * @param timewait_sec {int} 休眠 的时间值, 建议将此值设置为 1--5 秒内
72  * @return {int} 成功返回 0, 失败返回 -1
73  */
75  acl_pthread_pool_t *thr_pool, int timewait_sec);
76 
77 /**
78  * 添加注册函数,在线程创建后立即执行此初始化函数
79  * @param thr_pool {acl_pthread_pool_t*} 线程池对象,不能为空
80  * @param init_fn {int (*)(void*)} 工作线程初始化函数, 如果该函数返回 < 0,
81  * 则该线程自动退出。
82  * @param init_arg {void*} init_fn 所需要的参数
83  * @return {int} 0: OK; != 0: Error.
84  */
85 ACL_API int acl_pthread_pool_atinit(acl_pthread_pool_t *thr_pool,
86  int (*init_fn)(void *), void *init_arg);
87 
88 /**
89  * 添加注册函数,在线程退出立即执行此初函数
90  * @param thr_pool {acl_pthread_pool_t*} 线程池对象,不能为空
91  * @param free_fn {void (*)(void*)} 工作线程退出前必须执行的函数
92  * @param free_arg {void*} free_fn 所需要的参数
93  * @return {int} 0: OK; != 0: Error.
94  */
95 ACL_API int acl_pthread_pool_atfree(acl_pthread_pool_t *thr_pool,
96  void (*free_fn)(void *), void *free_arg);
97 
98 /**
99  * 销毁一个线程池对象, 成功销毁后该对象不能再用.
100  * @param thr_pool {acl_pthread_pool_t*} 线程池对象,不能为空
101  * @return {int} 0: 成功; != 0: 失败
102  */
103 ACL_API int acl_pthread_pool_destroy(acl_pthread_pool_t *thr_pool);
104 
105 /**
106  * 暂停一个线程池对象的运行, 停止后还可以再运行.
107  * @param thr_pool {acl_pthread_pool_t*} 线程池对象,不能为空
108  * @return {int} 0: 成功; != 0: 失败
109  */
110 ACL_API int acl_pthread_pool_stop(acl_pthread_pool_t *thr_pool);
111 
112 /**
113  * 向线程池添加一个任务
114  * @param thr_pool {acl_pthread_pool_t*} 线程池对象,不能为空
115  * @param run_fn {void (*)(*)} 当有可用工作线程时所调用的回调处理函数
116  * @param run_arg {void*} 回调函数 run_fn 所需要的回调参数
117  */
118 ACL_API void acl_pthread_pool_add_one(acl_pthread_pool_t *thr_pool,
119  void (*run_fn)(void *), void *run_arg);
120 #define acl_pthread_pool_add acl_pthread_pool_add_one
121 
122 /**
123  * 向线程池添加一个任务
124  * @param thr_pool {acl_pthread_pool_t*} 线程池对象,不能为空
125  * @param job {acl_pthread_job_t*} 由 acl_pthread_pool_alloc_job 创建的线程任务
126  */
127 ACL_API void acl_pthread_pool_add_job(acl_pthread_pool_t *thr_pool,
128  acl_pthread_job_t *job);
129 
130 /**
131  * 开始进行批处理方式的添加任务, 实际上是开始进行加锁
132  * @param thr_pool {acl_pthread_pool_t*} 线程池对象,不能为空
133  */
134 ACL_API void acl_pthread_pool_bat_add_begin(acl_pthread_pool_t *thr_pool);
135 
136 /**
137  * 添加一个新任务, 前提是已经成功加锁, 即调用 acl_pthread_pool_bat_add_begin 成功
138  * @param thr_pool {acl_pthread_pool_t*} 线程池对象,不能为空
139  * @param run_fn {void (*)(void*)} 当有可用工作线程时所调用的回调处理函数
140  * @param run_arg 回调函数 run_fn 所需要的回调参数
141  */
142 ACL_API void acl_pthread_pool_bat_add_one(acl_pthread_pool_t *thr_pool,
143  void (*run_fn)(void *), void *run_arg);
144 /**
145  * 添加一个新任务, 前提是已经成功加锁, 即调用 acl_pthread_pool_bat_add_begin 成功
146  * @param thr_pool {acl_pthread_pool_t*} 线程池对象,不能为空
147  * @param job {acl_pthread_job_t*} 由 acl_pthread_pool_alloc_job 创建的线程任务
148  */
149 ACL_API void acl_pthread_pool_bat_add_job(acl_pthread_pool_t *thr_pool,
150  acl_pthread_job_t *job);
151 
152 /**
153  * 批处理添加结束, 实际是解锁
154  * @param thr_pool {acl_pthread_pool_t*} 线程池对象,不能为空
155  */
156 ACL_API void acl_pthread_pool_bat_add_end(acl_pthread_pool_t *thr_pool);
157 
158 /**
159  * 设置线程池 POLLER 调度函数,若要使用此功能,需要在用函数
160  * acl_pthread_pool_create 后通过此函数设置调度函数,然后再
161  * 调用 acl_pthread_pool_start_poller 启动后台调度函数,该后台
162  * 调度函数会不断地调用 poller_fn (即用户的回调函数),用户可以
163  * 在回调函数里调用 acl_pthread_pool_add 将新任务添加进线程池中
164  * @param thr_pool {acl_pthread_pool_t*} 线程池对象,不能为空
165  * @param poller_fn {int (*)(void*)} 循环检测任务队列的回调函数
166  * @param poller_arg {void*} poller_fn 所需要的参数
167  */
168 ACL_API void acl_pthread_pool_set_poller(acl_pthread_pool_t *thr_pool,
169  int (*poller_fn)(void *), void *poller_arg);
170 /**
171  * 启动一个线程池 POLLER 调度线程
172  * @param thr_pool {acl_pthread_pool_t*} 线程池对象,不能为空
173  * @return 0 成功; != 0 失败, 可以对返回值调用 strerror(ret) 取得错误原因描述
174  */
176 
177 /**
178  * 以批处理方式进行任务的分发, 其内部其实是调用了 acl_pthread_pool_add_one()
179  * @return 0: OK; -1: err
180  */
181 ACL_API int acl_pthread_pool_add_dispatch(void *dispatch_arg,
182  void (*run_fn)(void *), void *run_arg);
183 
184 /**
185  * 以单个添加的方式进行任务的分发
186  * @return 0: OK; -1: err
187  * 注:worker_fn 中的第二个参数为ACL_WORKER_ATTR结构指针,由线程池的某个
188  * 工作线程维护,该结构指针中的成员变量 init_data 为用户的赋值传送变量,
189  * 如:数据库连接对象等。
190  */
191 ACL_API int acl_pthread_pool_dispatch(void *dispatch_arg,
192  void (*run_fn)(void *), void *run_arg);
193 
194 /**
195  * 获得当前线程池的最大线程数限制
196  * @param thr_pool {acl_pthread_pool_t*} 线程池对象,不能为空
197  * @return {int} 最大线程数限制值
198  */
199 ACL_API int acl_pthread_pool_limit(acl_pthread_pool_t *thr_pool);
200 
201 /**
202  * 获得当前线程池中的线程数
203  * @param thr_pool {acl_pthread_pool_t*} 线程池对象,不能为空
204  * @return {int} 返回线程池中的总线程数,返回值 < 0 表示出错
205  */
206 ACL_API int acl_pthread_pool_size(acl_pthread_pool_t *thr_pool);
207 
208 /**
209  * 获得当前线程池中的空闲线程数
210  * @param thr_pool {acl_pthread_pool_t*} 线程池对象,不能为空
211  * @return {int} 返回线程池中的空闲线程数,返回值 < 0 表示出错
212  */
213 ACL_API int acl_pthread_pool_idle(acl_pthread_pool_t *thr_pool);
214 
215 /**
216  * 获得当前线程池中的繁忙线程数
217  * @param thr_pool {acl_pthread_pool_t*} 线程池对象,不能为空
218  * @return {int} 返回线程池中的繁忙线程数,返回值 < 0 表示出错
219  */
220 ACL_API int acl_pthread_pool_busy(acl_pthread_pool_t *thr_pool);
221 
222 /**
223  * 设置线程任务调度超时警告的时间(毫秒)
224  * @param thr_pool {acl_pthread_pool_t*} 线程池对象,不能为空
225  * @param n {acl_int64} 当该值 > 0 时,如果线程任务的调度时间超过此值则会记录警告日志(毫秒)
226  */
228  acl_pthread_pool_t *thr_pool, acl_int64 n);
229 
230 /**
231  * 设置线程池中子线程等待任务的超时基准时间(毫秒)
232  * @param thr_pool {acl_pthread_pool_t*} 线程池对象,不能为空
233  * @param n {acl_int64} 当该值 > 0 时,子线程等待任务的超时等待基准时间(毫秒)
234  */
236  acl_pthread_pool_t *thr_pool, acl_int64 n);
237 
238 /**
239  * 当线程池中的任务发生堆积时,通过该函数设置任务队列堆积报警值
240  * @param thr_pool {acl_pthread_pool_t*} 线程池对象,不能为空
241  * @param max {int} 任务队列堆积报警值
242  */
243 ACL_API void acl_pthread_pool_set_qlen_warn(
244  acl_pthread_pool_t *thr_pool, int max);
245 /**
246  * 取得当前线程池全局队列中未处理的任务个数
247  * @param thr_pool {acl_pthread_pool_t*} 线程池对象,不能为空
248  * @return {int} 当前未处理的任务数,返回值 < 0 表示出错
249  */
250 ACL_API int acl_pthread_pool_qlen(acl_pthread_pool_t *thr_pool);
251 
252 /**
253  * 设置线程池中线程的堆栈大小
254  * @param thr_pool {acl_pthread_pool_t*} 线程池对象,不能为空
255  * @param size {size_t} 线程创建时的堆栈大小,单位为字节
256  */
257 ACL_API void acl_pthread_pool_set_stacksize(
258  acl_pthread_pool_t *thr_pool, size_t size);
259 
260 /**
261  * 初始化线程池属性值
262  * @param attr {acl_pthread_pool_attr_t*}
263  */
265 
266 /**
267  * 设置线程池属性中的最大堆栈大小(字节)
268  * @param attr {acl_pthread_pool_attr_t*}
269  * @param size {size_t}
270  */
272  acl_pthread_pool_attr_t *attr, size_t size);
273 
274 /**
275  * 设置线程池属性中的最大线程数限制值
276  * @param attr {acl_pthread_pool_attr_t*}
277  * @param threads_limit {int} 线程池中的最大线程数
278  */
280  acl_pthread_pool_attr_t *attr, int threads_limit);
281 
282 /**
283  * 设置线程池属性中线程空闲超时值
284  * @param attr {acl_pthread_pool_attr_t*}
285  * @param idle_timeout {int} 线程空闲超时时间(秒)
286  */
288  acl_pthread_pool_attr_t *attr, int idle_timeout);
289 
290 #ifdef __cplusplus
291 }
292 #endif
293 
294 #endif /* !__acl_pthread_pool_t_H_INCLUDED__ */
ACL_API int acl_pthread_pool_busy(acl_pthread_pool_t *thr_pool)
ACL_API void acl_pthread_pool_bat_add_end(acl_pthread_pool_t *thr_pool)
struct acl_pthread_pool_attr_t acl_pthread_pool_attr_t
ACL_API int acl_pthread_pool_idle(acl_pthread_pool_t *thr_pool)
ACL_API int acl_pthread_pool_destroy(acl_pthread_pool_t *thr_pool)
ACL_API void acl_pthread_pool_attr_set_threads_limit(acl_pthread_pool_attr_t *attr, int threads_limit)
ACL_API int acl_pthread_pool_start_poller(acl_pthread_pool_t *thr_pool)
ACL_API void acl_pthread_pool_set_schedule_wait(acl_pthread_pool_t *thr_pool, acl_int64 n)
ACL_API void acl_pthread_pool_add_one(acl_pthread_pool_t *thr_pool, void(*run_fn)(void *), void *run_arg)
ACL_API void acl_pthread_pool_set_poller(acl_pthread_pool_t *thr_pool, int(*poller_fn)(void *), void *poller_arg)
ACL_API void acl_pthread_pool_attr_set_idle_timeout(acl_pthread_pool_attr_t *attr, int idle_timeout)
ACL_API void acl_pthread_pool_bat_add_begin(acl_pthread_pool_t *thr_pool)
ACL_API void acl_pthread_pool_attr_set_stacksize(acl_pthread_pool_attr_t *attr, size_t size)
ACL_API acl_pthread_job_t * acl_pthread_pool_alloc_job(void(*run_fn)(void *), void *run_arg, int fixed)
ACL_API void acl_pthread_pool_bat_add_one(acl_pthread_pool_t *thr_pool, void(*run_fn)(void *), void *run_arg)
struct acl_pthread_job_t acl_pthread_job_t
ACL_API int acl_pthread_pool_atinit(acl_pthread_pool_t *thr_pool, int(*init_fn)(void *), void *init_arg)
ACL_API void acl_pthread_pool_set_schedule_warn(acl_pthread_pool_t *thr_pool, acl_int64 n)
ACL_API void acl_pthread_pool_set_stacksize(acl_pthread_pool_t *thr_pool, size_t size)
ACL_API int acl_pthread_pool_size(acl_pthread_pool_t *thr_pool)
struct acl_pthread_pool_t acl_pthread_pool_t
ACL_API void acl_pthread_pool_add_job(acl_pthread_pool_t *thr_pool, acl_pthread_job_t *job)
ACL_API void acl_pthread_pool_bat_add_job(acl_pthread_pool_t *thr_pool, acl_pthread_job_t *job)
ACL_API int acl_pthread_pool_dispatch(void *dispatch_arg, void(*run_fn)(void *), void *run_arg)
ACL_API int acl_pthread_pool_set_timewait(acl_pthread_pool_t *thr_pool, int timewait_sec)
ACL_API acl_pthread_pool_t * acl_thread_pool_create(int threads_limit, int idle_timeout)
ACL_API int acl_pthread_pool_stop(acl_pthread_pool_t *thr_pool)
ACL_API void acl_pthread_pool_set_qlen_warn(acl_pthread_pool_t *thr_pool, int max)
ACL_API void acl_pthread_pool_attr_init(acl_pthread_pool_attr_t *attr)
ACL_API int acl_pthread_pool_limit(acl_pthread_pool_t *thr_pool)
ACL_API int acl_pthread_pool_atfree(acl_pthread_pool_t *thr_pool, void(*free_fn)(void *), void *free_arg)
ACL_API void acl_pthread_pool_free_job(acl_pthread_job_t *job)
ACL_API int acl_pthread_pool_qlen(acl_pthread_pool_t *thr_pool)
ACL_API int acl_pthread_pool_add_dispatch(void *dispatch_arg, void(*run_fn)(void *), void *run_arg)
ACL_API acl_pthread_pool_t * acl_pthread_pool_create(const acl_pthread_pool_attr_t *attr)