基于 Reactor 模式的事件循环
More...
#include <reactor.hpp>
|
| using | FdCallback = std::function< void(int)> |
| | 文件描述符事件回调类型,参数为触发事件的 fd
|
| |
| using | Task = std::function< void()> |
| | 异步任务类型
|
| |
基于 Reactor 模式的事件循环
封装 epoll (Linux) 或 kqueue (macOS) 实现高性能 I/O 多路复用。
- 设计特点
- 边缘触发(ET)模式,减少系统调用次数
- 无锁任务队列,支持跨线程安全提交任务
- 支持文件描述符事件和定时器事件
- 通过 eventfd/pipe 实现跨线程唤醒
- 线程模型
- run() 方法在单线程中执行事件循环
- add_fd/modify_fd/remove_fd/add_timer 可从任意线程调用
- 实际的 fd 操作通过任务队列在事件循环线程中执行
- 使用示例
reactor.
add_fd(client_fd, [](
int fd) {
char buf[1024];
read(fd, buf, sizeof(buf));
});
std::cout << "Timer fired!" << std::endl;
});
基于 Reactor 模式的事件循环
Definition reactor.hpp:81
void run()
启动事件循环
Definition reactor.hpp:429
void add_fd(int fd, FdCallback cb)
注册文件描述符的读事件
Definition reactor.hpp:272
void add_timer(int interval_ms, FdCallback cb)
添加周期性定时器
Definition reactor.hpp:286
◆ FdCallback
◆ Task
◆ Reactor()
| fix40::Reactor::Reactor |
( |
| ) |
|
|
inline |
构造 Reactor
创建 epoll/kqueue 实例和唤醒机制(eventfd/pipe)。
- Exceptions
-
| std::runtime_error | 创建失败时抛出异常 |
◆ ~Reactor()
| fix40::Reactor::~Reactor |
( |
| ) |
|
|
inline |
析构 Reactor
关闭 epoll/kqueue 实例和所有定时器 fd。
◆ add_fd()
| void fix40::Reactor::add_fd |
( |
int |
fd, |
|
|
FdCallback |
cb |
|
) |
| |
|
inline |
注册文件描述符的读事件
- Parameters
-
| fd | 文件描述符(应已设置为非阻塞) |
| cb | 读事件回调函数 |
可从任意线程调用,实际注册在事件循环线程中执行。
◆ add_timer()
| void fix40::Reactor::add_timer |
( |
int |
interval_ms, |
|
|
FdCallback |
cb |
|
) |
| |
|
inline |
添加周期性定时器
- Parameters
-
| interval_ms | 定时间隔(毫秒) |
| cb | 定时器回调函数 |
- Note
- Linux 使用 timerfd,macOS 使用 kqueue EVFILT_TIMER
◆ is_running()
| bool fix40::Reactor::is_running |
( |
| ) |
const |
|
inline |
检查事件循环是否正在运行
- Returns
- true 正在运行
-
false 已停止或未启动
◆ modify_fd()
| void fix40::Reactor::modify_fd |
( |
int |
fd, |
|
|
uint32_t |
event_mask, |
|
|
FdCallback |
write_cb |
|
) |
| |
|
inline |
修改文件描述符的事件监听
- Parameters
-
| fd | 文件描述符 |
| event_mask | 事件掩码(EventType::READ | EventType::WRITE) |
| write_cb | 写事件回调函数(可为 nullptr) |
用于动态添加/移除写事件监听。
◆ remove_fd()
| void fix40::Reactor::remove_fd |
( |
int |
fd | ) |
|
|
inline |
移除文件描述符
- Parameters
-
从 epoll/kqueue 中移除 fd 并清理回调。
◆ run()
| void fix40::Reactor::run |
( |
| ) |
|
|
inline |
启动事件循环
阻塞当前线程,持续处理 I/O 事件直到调用 stop()。
- 事件循环流程
- 处理任务队列中的挂起任务
- 调用 epoll_wait/kevent 等待事件
- 分发事件到对应的回调函数
- 重复以上步骤
◆ stop()
| void fix40::Reactor::stop |
( |
| ) |
|
|
inline |
停止事件循环
设置停止标志并唤醒事件循环,使 run() 返回。 可从任意线程调用。
The documentation for this class was generated from the following file: