acl  3.5.3.0
master_threads.hpp
浏览该文件的文档.
1 #pragma once
2 #include "master_base.hpp"
3 #include "../stdlib/thread_mutex.hpp"
4 
5 #ifndef ACL_CLIENT_ONLY
6 
7 struct ACL_VSTREAM;
8 struct ACL_EVENT;
9 struct ACL_VSTRING;
10 struct acl_pthread_pool_t;
11 
12 namespace acl {
13 
14 class socket_stream;
15 
16 /**
17  * 线程池服务器框架类,该类为纯虚类,子类需要实现其中的纯虚函数,
18  * 每一个进程仅能有一个该类对象实例,否则程序会被终止
19  */
21 {
22 public:
23  /**
24  * 开始运行,调用该函数是指该服务进程是在 acl_master 服务框架
25  * 控制之下运行,一般用于生产机状态
26  * @param argc {int} 从 main 中传递的第一个参数,表示参数个数
27  * @param argv {char**} 从 main 中传递的第二个参数
28  */
29  void run_daemon(int argc, char** argv);
30 
31  /**
32  * 在单独运行时的处理函数,用户可以调用此函数进行一些必要的调试工作
33  * @param addrs {const char*} 监听地址列表,格式:IP:PORT, IP:PORT...
34  * @param path {const char*} 配置文件全路径
35  * @param count {unsigned int} 循环服务的次数,达到此值后函数自动返回;
36  * 若该值为 0 则表示程序一直循环处理外来请求而不返回
37  * @param threads_count {int} 当该值大于 1 时表示自动采用线程池方式,
38  * 该值只有当 count != 1 时才有效,即若 count == 1 则仅运行一次就返回
39  * 且不会启动线程处理客户端请求
40  * @return {bool} 监听是否成功
41  * 注:count, threads_count 两个参数不再有效,将会使用配置文件中的
42  * 配置值 ioctl_use_limit(控制处理连接的个数) 及 ioctl_max_threads(
43  * 控制启动的最大线程数)
44  */
45  bool run_alone(const char* addrs, const char* path = NULL,
46  unsigned int count = 1, int threads_count = 1);
47 
48  /**
49  * 监听给定流的可读状态
50  * @param stream {socket_stream*}
51  */
52  void thread_enable_read(socket_stream* stream);
53 
54  /**
55  * 不再监听给定流的可读状态
56  * @param stream {socket_stream*}
57  */
58  void thread_disable_read(socket_stream* stream);
59 
60  /**
61  * 获得配置文件路径
62  * @return {const char*} 返回值为 NULL 表示没有设配置文件
63  */
64  const char* get_conf_path(void) const;
65 
66  /**
67  * 获得当前线程池队列中积压的待处理任务数,该 API 可以方便应用决定何时
68  * 需要进行过载保护,在压力大的时候将后续的任务丢弃
69  * @return {size_t}
70  */
71  size_t task_qlen(void) const;
72 
73 public:
74  /**
75  * 获得 lib_acl C 库中的线程池句柄
76  * @return {acl_pthread_pool_t*}
77  */
78  acl_pthread_pool_t* threads_pool(void) const;
79 
80 protected:
81  // 该类不能直接被实例化
83  virtual ~master_threads();
84 
85  /**
86  * 纯虚函数:当某个客户端连接有数据可读或关闭或出错时调用此函数
87  * @param stream {socket_stream*}
88  * @return {bool} 返回 false 则表示当函数返回后需要关闭连接,
89  * 否则表示需要保持长连接,如果该流出错,则应用应该返回 false
90  */
91  virtual bool thread_on_read(socket_stream* stream) = 0;
92 
93  /**
94  * 框架在调用 thread_on_read 后且其返回 true 后,会自动调用本函数
95  * 以判断是否监控流对象是否可读
96  * @param stream {socket_stream*}
97  * @return {bool} 如果返回 false,则框架不再监控该流对象
98  */
100  {
101  (void) stream;
102  return true;
103  }
104 
105  /**
106  * 当线程池中的某个线程获得一个连接时的回调函数,子类可以做一些
107  * 初始化工作,该函数是在主线程的线程空间中运行
108  * @param stream {socket_stream*}
109  * @return {bool} 如果返回 false 则表示子类要求关闭连接,而不
110  * 必将该连接再传递至 thread_main 过程
111  */
113  {
114  (void) stream;
115  return true;
116  }
117 
118  /**
119  * 当接收到一个客户端连接后,服务端回调此函数与客户端进行握手的操作,
120  * 该函数将在 thread_on_accept 之后被调用
121  * @return {bool} 如果返回 false 则表示子类要求关闭连接,而不
122  * 必将该连接再传递至 thread_main 过程
123  */
125  {
126  (void) stream;
127  return true;
128  }
129 
130  /**
131  * 当某个网络连接的 IO 读写超时时的回调函数,如果该函数返回 true 则
132  * 表示继续等待下一次读写,否则则希望关闭该连接
133  * @param stream {socket_stream*}
134  * @return {bool} 如果返回 false 则表示子类要求关闭连接,否则则要求
135  * 继续监听该连接
136  */
138  {
139  (void) stream;
140  return false;
141  }
142 
143  /**
144  * 当与某个线程绑定的连接关闭时的回调函数
145  * @param stream {socket_stream*}
146  * 注:当在 thread_on_accept 返回 false 后流关闭时该函数并不会
147  * 被调用
148  */
149  virtual void thread_on_close(socket_stream* stream) { (void) stream; }
150 
151  /**
152  * 当线程池中一个新线程被创建时的回调函数
153  */
154  virtual void thread_on_init() {}
155 
156  /**
157  * 当线程池中一个线程退出时的回调函数
158  */
159  virtual void thread_on_exit() {}
160 
161  /**
162  * 当子进程需要退出时框架将回调此函数,框架决定子进程是否退出取决于:
163  * 1) 如果此函数返回 true 则子进程立即退出,否则:
164  * 2) 如果该子进程所有客户端连接都已关闭,则子进程立即退出,否则:
165  * 3) 查看配置文件中的配置项(ioctl_quick_abort),如果该配置项非 0 则
166  * 子进程立即退出,否则:
167  * 4) 等所有客户端连接关闭后才退出
168  * @param nclients {size_t} 当前连接的客户端个数
169  * @param nthreads {size_t} 当前线程池中繁忙的工作线程个数
170  * @return {bool} 返回 false 表示当前子进程还不能退出,否则表示当前
171  * 子进程可以退出了
172  */
173  virtual bool proc_exit_timer(size_t nclients, size_t nthreads)
174  {
175  (void) nclients;
176  (void) nthreads;
177  return true;
178  }
179 
180 private:
181  thread_mutex lock_;
182 
183  void push_back(server_socket* ss);
184  void run(int argc, char** argv);
185 
186  // 当接收到一个客户端连接时回调此函数
187  static int service_main(void*, ACL_VSTREAM*);
188 
189  // 当监听一个服务地址时回调此函数
190  static void service_on_listen(void*, ACL_VSTREAM*);
191 
192  // 当接收到一个客户连接时的回调函数,可以进行一些初始化
193  static int service_on_accept(void*, ACL_VSTREAM*);
194 
195  // 当接收到客户端连接后服务端需要与客户端做一些事先的握手动作时
196  // 回调此函数,该函数会在 service_on_accept 之后被调用
197  static int service_on_handshake(void*, ACL_VSTREAM*);
198 
199  // 当客户端连接读写超时时的回调函数
200  static int service_on_timeout(void*, ACL_VSTREAM*);
201 
202  // 当客户端连接关闭时的回调函数
203  static void service_on_close(void*, ACL_VSTREAM*);
204 
205  // 当进程切换用户身份后调用的回调函数
206  static void service_pre_jail(void*);
207 
208  // 当进程切换用户身份后调用的回调函数
209  static void service_init(void*);
210 
211  // 当进程需要退出时调用此函数,由应用来确定进程是否需要退出
212  static int service_exit_timer(void*, size_t, size_t);
213 
214  // 当进程退出时调用的回调函数
215  static void service_exit(void*);
216 
217  // 当线程创建后调用的回调函数
218  static int thread_init(void*);
219 
220  // 当线程退出前调用的回调函数
221  static void thread_exit(void*);
222 
223  // 当进程收到 SIGHUP 信号后会回调本函数
224  static int service_on_sighup(void*, ACL_VSTRING*);
225 };
226 
227 } // namespace acl
228 
229 #endif // ACL_CLIENT_ONLY
virtual void thread_on_exit()
virtual void thread_on_close(socket_stream *stream)
virtual void thread_on_init()
struct acl_pthread_pool_t acl_pthread_pool_t
virtual bool thread_on_timeout(socket_stream *stream)
virtual bool thread_on_handshake(socket_stream *stream)
struct ACL_EVENT ACL_EVENT
Definition: acl_events.h:43
virtual bool keep_read(socket_stream *stream)
virtual bool proc_exit_timer(size_t nclients, size_t nthreads)
#define ACL_CPP_API
virtual bool thread_on_accept(socket_stream *stream)