首先来预览一下主Reactor头文件:
namespace atlas {

/// 主 Reactor:仅负责 accept 新连接,分发给 SubReactor,就是对Reactor加上了连接请求和分发给SubReactor
class MainReactor : public Reactor {
public:
MainReactor(uint16_t port, int subReactorCount = 4, int maxEvents = 1024);
~MainReactor();

void start();
void stop();

SubReactor* nextSubReactor();
void forEachSubReactor(std::function<void(SubReactor*)> f);
void setNewConnectionCallback(std::function<void(int, const std::string&, SubReactor*)> cb) {
    newConnectionCallback_ = std::move(cb);
}

TcpServer* server() { return &server_; }

private:
void handleEvents(const std::vectorEpoll::Event& events) override;
void handleAccept();

TcpServer server_;
std::vector<std::unique_ptr<SubReactor>> subReactors_;
std::vector<std::thread> subThreads_;
std::atomic<size_t> nextSubIndex_{0};
std::function<void(int, const std::string&, SubReactor*)> newConnectionCallback_;

};

} // namespace atlas

首先初始化的三个参数是端口号,从reactor的数量和最大事件数量,start就是抽一个从reactor进去循环,quit就是先停止然后让从reactor退出。

再来看看从Reactor的头文件:
namespace atlas {

/// 从 Reactor:处理 I/O 读写事件,每个 SubReactor 运行在独立线程
class SubReactor : public Reactor {
public:
SubReactor(int index, int maxEvents = 1024);
~SubReactor() override;

void addConnection(int fd, ConnectionType type, const std::string& clientIp = "",
                  const std::shared_ptr<Connection>& peer = nullptr,
                  const std::string& initialSend = "");
/// 设置客户端连接建立后的回调(用于设置 message/close 等)
void setClientSetup(std::function<void(Connection*)> cb) { clientSetup_ = std::move(cb); }
/// 设置后端连接建立后的回调(backend, client)
void setBackendSetup(std::function<void(Connection*, Connection*)> cb) { backendSetup_ = std::move(cb); }
void removeConnection(const std::shared_ptr<Connection>& conn);

std::shared_ptr<Connection> getConnection(int fd) const;
int index() const { return index_; }

void runInLoop(std::function<void()> cb);
void queueInLoop(std::function<void()> cb);

private:
void handleEvents(const std::vectorEpoll::Event& events) override;
void handleNewConnection(int fd, ConnectionType type, const std::string& clientIp,
const std::shared_ptr& peer,
const std::string& initialSend);
void handleConnectionEvent(const std::shared_ptr& conn, uint32_t events);

int index_;
std::unordered_map<int, std::shared_ptr<Connection>> connections_;
int wakeupFd_{-1};  // eventfd for runInLoop
std::vector<std::function<void()>> pendingFunctors_;
std::mutex pendingMutex_;
std::function<void(Connection*)> clientSetup_;
std::function<void(Connection*, Connection*)> backendSetup_;

};

} // namespace atlas