Reactor

177 阅读1分钟

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();