Reactor模式
- 使用一个线程来接收连接并分配给对应的handler
- handlers使用另一个线程(可以和接收线程相同,也可以另外开辟一个线程或一组线程)来处理相关的读、写、错误、关闭等事件
各个模块的简单职责
EventHandler
- socket_fd
- socket_fd相关的读、写、关闭以及错误处理接口
Reactor
- register和unregister handler
- dispatch handler
main
- server的server_socet_fd封装成一个server_handler注册到Reactor中
- server_handler的会accept多个client_socket_fd,每个client_socket_fd都封装成一个client_handler,然后注册到Reactor中
- reactor->loop()
涉及的源码
// EventHandler.h
class EventHandler{
typedef std::function<void(int)> Callback;
public:
EventHandler(int socket_fd);
~EventHandler();
void onReceiveReadEvent();
void onReceiveWriteEvent();
void onReceiveErrorEvent();
void onReceiveCloseEvent();
void setReadCallback(Callback callback);
void setWriteCallback(Callback callback);
void setErrorCallback(Callback callback);
void setCloseCallback(Callback callback);
int getSocketFd();
private:
int m_socket_fd;
std::function<void(int)> m_read_callback;
std::function<void(int)> m_write_callback;
std::function<void(int)> m_error_callback;
std::function<void(int)> m_close_callback;
};
// Reactor.h
class Reactor {
public:
static std::unique_ptr<Reactor> create();
~Reactor();
void registerHandler(std::shared_ptr<EventHandler> handler, int events);
void unregisterHandler(std::shared_ptr<EventHandler> handler);
void loop();
private:
Reactor();
int m_epoll_fd;
std::unordered_map<int, std::shared_ptr<EventHandler>> m_handler_map;
};
// main.cpp
std::shared_ptr<Reactor> reactor = Reactor::create();
std::shared_ptr<EventHandler> server_handler(new EventHandler(server_socket_fd));
server_handler->setXXXCallback(...);
//...
reactor->registerHandler(server_handler, EPOLLIN | EPOLLET);
reactor->loop();