FIX 4.0 Demo 1.0
Loading...
Searching...
No Matches
fix40::Reactor Class Reference

基于 Reactor 模式的事件循环 More...

#include <reactor.hpp>

Collaboration diagram for fix40::Reactor:
Collaboration graph

Public Types

using FdCallback = std::function< void(int)>
 文件描述符事件回调类型,参数为触发事件的 fd
 
using Task = std::function< void()>
 异步任务类型
 

Public Member Functions

 Reactor ()
 构造 Reactor
 
 ~Reactor ()
 析构 Reactor
 
void add_fd (int fd, FdCallback cb)
 注册文件描述符的读事件
 
void modify_fd (int fd, uint32_t event_mask, FdCallback write_cb)
 修改文件描述符的事件监听
 
void add_timer (int interval_ms, FdCallback cb)
 添加周期性定时器
 
void remove_fd (int fd)
 移除文件描述符
 
void run ()
 启动事件循环
 
void stop ()
 停止事件循环
 
bool is_running () const
 检查事件循环是否正在运行
 

Detailed Description

基于 Reactor 模式的事件循环

封装 epoll (Linux) 或 kqueue (macOS) 实现高性能 I/O 多路复用。

设计特点
  • 边缘触发(ET)模式,减少系统调用次数
  • 无锁任务队列,支持跨线程安全提交任务
  • 支持文件描述符事件和定时器事件
  • 通过 eventfd/pipe 实现跨线程唤醒
线程模型
  • run() 方法在单线程中执行事件循环
  • add_fd/modify_fd/remove_fd/add_timer 可从任意线程调用
  • 实际的 fd 操作通过任务队列在事件循环线程中执行
使用示例
Reactor reactor;
// 注册读事件
reactor.add_fd(client_fd, [](int fd) {
char buf[1024];
read(fd, buf, sizeof(buf));
});
// 添加定时器
reactor.add_timer(1000, [](int) {
std::cout << "Timer fired!" << std::endl;
});
// 启动事件循环(阻塞)
reactor.run();
基于 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

Member Typedef Documentation

◆ FdCallback

using fix40::Reactor::FdCallback = std::function<void(int)>

文件描述符事件回调类型,参数为触发事件的 fd

◆ Task

using fix40::Reactor::Task = std::function<void()>

异步任务类型

Constructor & Destructor Documentation

◆ Reactor()

fix40::Reactor::Reactor ( )
inline

构造 Reactor

创建 epoll/kqueue 实例和唤醒机制(eventfd/pipe)。

Exceptions
std::runtime_error创建失败时抛出异常

◆ ~Reactor()

fix40::Reactor::~Reactor ( )
inline

析构 Reactor

关闭 epoll/kqueue 实例和所有定时器 fd。

Member Function Documentation

◆ add_fd()

void fix40::Reactor::add_fd ( int  fd,
FdCallback  cb 
)
inline

注册文件描述符的读事件

Parameters
fd文件描述符(应已设置为非阻塞)
cb读事件回调函数

可从任意线程调用,实际注册在事件循环线程中执行。

Here is the call graph for this function:

◆ add_timer()

void fix40::Reactor::add_timer ( int  interval_ms,
FdCallback  cb 
)
inline

添加周期性定时器

Parameters
interval_ms定时间隔(毫秒)
cb定时器回调函数
Note
Linux 使用 timerfd,macOS 使用 kqueue EVFILT_TIMER
Here is the call graph for this function:

◆ 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)

用于动态添加/移除写事件监听。

Here is the call graph for this function:
Here is the caller graph for this function:

◆ remove_fd()

void fix40::Reactor::remove_fd ( int  fd)
inline

移除文件描述符

Parameters
fd要移除的文件描述符

从 epoll/kqueue 中移除 fd 并清理回调。

Here is the call graph for this function:

◆ run()

void fix40::Reactor::run ( )
inline

启动事件循环

阻塞当前线程,持续处理 I/O 事件直到调用 stop()

事件循环流程
  1. 处理任务队列中的挂起任务
  2. 调用 epoll_wait/kevent 等待事件
  3. 分发事件到对应的回调函数
  4. 重复以上步骤

◆ stop()

void fix40::Reactor::stop ( )
inline

停止事件循环

设置停止标志并唤醒事件循环,使 run() 返回。 可从任意线程调用。


The documentation for this class was generated from the following file: