一、Reactor 模式

Reactor 模式是一种事件处理设计模式,用于处理多个并发输入事件。它通过事件驱动的方式,将事件分发给相应的处理程序,从而实现对并发事件的高效处理。Reactor 模式广泛应用于网络编程、服务器框架等领域,例如 Java 的 NIO、Netty 框架,以及 C++ 的 Boost.Asio 等。
Reactor 模式的核心思想
Reactor 模式的核心思想是:
- 事件驱动:通过事件循环(Event Loop)监听多个事件源(多个文件描述符)(如 Socket、文件描述符等),该事件驱动器可以采用 select,poll,epoll 等。
- 事件分发:当事件发生时,Reactor 将事件分发给对应的事件处理器(Event Handler)。
- 非阻塞:Reactor 模式通常与非阻塞 I/O 结合使用,避免线程阻塞,所以需要将 Socket、文件描述符等通过 fcntl 函数设置为非阻塞状态。
Reactor 模式的组成
Reactor 模式通常由以下几个组件组成:
-
Loop(反应器 / 事件循环)
- 负责监听事件源(多个文件描述符)(如 Socket、文件描述符等)。
- 当事件发生时,将事件分发给对应的事件处理器。
-
Dispatcher(事件多路分发器)
- 当事件发生时,通知 Event Handler 进行处理。
-
Event Handler(事件处理器)
- 定义处理事件的接口。
- 每个事件源对应一个事件处理器。

二、案例使用——基于 Reactor 的计算器
封装 epoll
#pragma once
#include <iostream>
#include <sys/epoll.h>
#
LogModule;
EpollMoudle {
{
:
() : _epfd() {}
{
_epfd = ();
(_epfd < ) {
(LogLevel::ERROR) << ;
(EPOLL_CREATE_ERR);
}
(LogLevel::INFO) << << _epfd;
}
{
n = (_epfd, revs, num, timeout);
(n < ) {
(LogLevel::WARNING) << ;
}
n;
}
{
ev;
ev.events = events;
ev.data.fd = sockfd;
n = (_epfd, flag, sockfd, &ev);
(n < ) {
(LogLevel::WARNING) << ;
}
}
{ (sockfd, events, EPOLL_CTL_ADD); }
{ (sockfd, events, EPOLL_CTL_MOD); }
{
n = (_epfd, EPOLL_CTL_DEL, sockfd, );
(n < ) {
(LogLevel::WARNING) << ;
}
}
~() {}
:
_epfd;
};
}




