acl  3.5.3.0
thread_pool.hpp
浏览该文件的文档.
1 #pragma once
2 #include "noncopyable.hpp"
3 
4 struct acl_pthread_pool_t;
6 
7 namespace acl
8 {
9 
10 class thread_job;
11 
12 /**
13  * 线程池管理类,该类内管理的线程池中的线程是半驻留的(即当线程空闲一定时间后
14  * 自动退出),该类有两个非纯虚函数:thread_on_init(线程池中的某个线程第一次
15  * 创建时会首先调用此函数),thread_on_exit(线程池中的某个线程退出时调用此函数)
16  */
18 {
19 public:
20  thread_pool(void);
21  virtual ~thread_pool(void);
22 
23  /**
24  * 启动线程池,在创建线程池对象后,必须首先调用此函数以启动线程池
25  */
26  void start(void);
27 
28  /**
29  * 停止并销毁线程池,并释放线程池资源,调用此函数可以使所有子线程退出,
30  * 但并不释放本实例,如果该类实例是动态分配的则用户应该自释放类实例,
31  * 在调用本函数后,如果想重启线程池过程,则必须重新调用 start 过程
32  */
33  void stop(void);
34 
35  /**
36  * 等待线程池中的所有线程池执行完所有任务
37  */
38  void wait(void);
39 
40  /**
41  * 将一个任务交给线程池中的一个线程去执行,线程池中的
42  * 线程会执行该任务中的 run 函数
43  * @param job {thread_job*} 线程任务
44  * @return {bool} 是否成功
45  */
46  bool run(thread_job* job);
47 
48  /**
49  * 将一个任务交给线程池中的一个线程去执行,线程池中的
50  * 线程会执行该任务中的 run 函数;该函数功能与 run 功能完全相同,只是为了
51  * 使 JAVA 程序员看起来更为熟悉才提供了此接口
52  * @param job {thread_job*} 线程任务
53  * @return {bool} 是否成功
54  */
55  bool execute(thread_job* job);
56 
57  /**
58  * 在调用 start 前调用此函数可以设置所创建线程的堆栈大小
59  * @param size {size_t} 线程堆栈大小,当该值为 0 或未
60  * 调用此函数,则所创建的线程堆栈大小为系统的默认值
61  * @return {thread&}
62  */
63  thread_pool& set_stacksize(size_t size);
64 
65  /**
66  * 设置线程池最大线程个数限制
67  * @param max {size_t} 最大线程数,如果不调用此函数,则内部缺省值为 100
68  * @return {thread_pool&}
69  */
70  thread_pool& set_limit(size_t max);
71 
72  /**
73  * 获得当前线程池最大线程数量限制
74  * @return {size_t}
75  */
76  size_t get_limit(void) const;
77 
78  /**
79  * 设置线程池中空闲线程的超时退出时间
80  * @param ttl {int} 空闲超时时间(秒),如果不调用此函数,则内部缺省为 0
81  * @return {thread_pool&}
82  */
83  thread_pool& set_idle(int ttl);
84 
85  /**
86  * 获得当前线程池中子线程的数量
87  * @return {int} 返回线程池中子线程的数量,如果未通过调用 start
88  * 启动线程池过程,则该函数返回 -1
89  */
90  int threads_count(void) const;
91 
92  /**
93  * 获得当前线程池中未被处理的任务数量
94  * @return {int} 当线程池还未被启动(即未调用 start)或已经销毁则返回 -1
95  */
96  int task_qlen(void) const;
97 
98 protected:
99  /**
100  * 当线程池中的子线程第一次被创建时,该虚函数将被调用,
101  * 用户可以在自己的实现中做一些初始化工作
102  * @return {bool} 初始化是否成功
103  */
104  virtual bool thread_on_init(void) { return true; }
105 
106  /**
107  * 当线程池中的子线程退出时,该虚函数将被调用,用户可以
108  * 在自己的实现 中做一些资源释放工作
109  */
110  virtual void thread_on_exit(void) {}
111 
112 private:
113  size_t stack_size_;
114  size_t threads_limit_;
115  int thread_idle_;
116 
117  acl_pthread_pool_t* thr_pool_;
118  acl_pthread_pool_attr_t* thr_attr_;
119 
120  static void thread_run(void* arg);
121  static int thread_init(void* arg);
122  static void thread_exit(void* arg);
123 };
124 
125 } // namespace acl
virtual bool thread_on_init(void)
struct acl_pthread_pool_t acl_pthread_pool_t
#define ACL_CPP_API
virtual void thread_on_exit(void)