Reactor是事件分发器基于IO 多路复用epoll/poll/select 事件回调把IO事件、读写、异常统一监听、分发到对应处理函数是高性能网络服务经典模型总结来说Reactor IO 多路复用 事件分发 回调1. 思路2. 参考代码Reactor模式实现代码3. 附加OneThreadOneLoop多进程方案One Thread One Loop OTOL是一种设计模式通常用于描述基于事件驱动编程Event Driven Programming的架构特别是在使用异步I/OAsynchronous I/O框架时。这种模式强调每个线程运行一个独立的事件循环Event Loop从而实现高效的并发处理。核心概念事件循环Event Loop事件循环是异步编程的核心负责监听事件如 I/O 操作、定时器事件等并触发相应的回调函数通常是一个单线程的执行模型通过多路复用技术如 epoll 、 select 或 poll 高效地管理多个 I/O 操作单线程模型在 One Thread One Loop 模式中每个线程运行一个独立的事件循环这种设计避免了多线程编程中的复杂同步问题同时利用了现代操作系统高效的 I/O 多路复用机制只要把单 Reactor 写完扩展多进程很容易每个进程管理的连接和 fd彼此不要重复每个 Reactor自己处理自己的 sockfd 的完整生命周期不涉及任何 IO 穿插、乱序问题多线程方案1Eventfd事件驱动如果不使用管道的话可以使用Eventfd是一个轻量级的事件通知机制基于文件描述符它可以与I/O多路复用机制如epoll 结合使用内核维护一个64位的计数器 write会增加计数器 read 会减少进程间事件通知#include stdio.h #include stdlib.h #include unistd.h #include sys/eventfd.h #include sys/wait.h int main() { // 创建一个 eventfd 文件描述符用来发事件 // EFD_CLOEXEC执行新程序时自动关闭安全规范 int efd eventfd(0, EFD_CLOEXEC); if (efd -1) { perror(eventfd); return 1; } // fork() 创建子进程 // 调用后变成两个进程父进程 子进程 pid_t pid fork(); if (pid -1) { perror(fork); return 1; } if (pid 0) { // 这里是 【子进程】 uint64_t value; // 阻塞等待读取 eventfd直到有人写入才会继续 read(efd, value, sizeof(value)); printf(Child process received event\n); close(efd); return 0; } else { // 这里是 【父进程】 uint64_t value 1; // 向 eventfd 写入 发送事件 write(efd, value, sizeof(value)); printf(Parent process sent event\n); wait(NULL); // 等待子进程结束 close(efd); return 0; } }流程创建 eventfd -- fork子进程 --子进程阻塞在 read等事件 -- 父进程 write发送事件-- 子进程收到打印提示 -- 结束线程间事件通知:#include stdio.h #include stdlib.h #include unistd.h #include sys/eventfd.h #include pthread.h // 工作线程函数 void* worker_thread(void* arg) { int efd *(int*)arg; // 获取 eventfd uint64_t value; // 阻塞等待事件 read(efd, value, sizeof(value)); printf(Worker thread received event\n); return NULL; } int main() { // 创建 eventfd int efd eventfd(0, EFD_CLOEXEC); if (efd -1) { perror(eventfd); return 1; } pthread_t thread; // 创建工作线程 pthread_create(thread, NULL, worker_thread, efd); // 主线程发送事件 uint64_t value 1; write(efd, value, sizeof(value)); printf(Main thread sent event\n); // 等待工作线程结束 pthread_join(thread, NULL); close(efd); return 0; }流程创建 eventfd -- 创建一个工作线程 --工作线程阻塞在 read等事件--主线程 write发送-- 工作线程收到打印提示 -- 结束Eventfd工作模式普通模式不设置 EFD_SEMAPHORE 读取的时候计数器会清空设置EFD_SEMAPHORE 信号量模式多线程方案2