Phase 4:业务线程池 — IO/计算解耦

问题:Muduo 的 4 个 IO 线程负责所有 onMessage 回调。如果在 IO 线程里直接执行 MySQL 查询(可能耗时 50-200ms),会阻塞事件循环,其他连接的 TCP 事件无法处理。

第 15 步:同步队列

文件:include/server/threadpool/syncQueue_2.hpp

双条件变量是关键------notEmpty 和 notFull 分别让生产者和消费者精确等待,避免虚假唤醒。

第 16 步:FixedThreadPool

文件:include/server/threadpool/FixedThreadPool.hpp

packaged_task + future 是关键------业务代码可以通过 future.get() 同步等待任务执行结果。

第 17 步:dispatch() 统一调度

在 ChatService 中添加 dispatch 模板和 setThreadPool:

runInLoop 的作用:Muduo 要求只能在 IO 线程中操作 TcpConnection。业务线程完成后必须把 send 操作"投递"回 IO 线程执行。

第 18 步:main.cpp 支持 --no-pool

相关推荐
程序员-Benothing8 小时前
Vim编辑器从入门到精通:模式、快捷键、配置、插件
linux·运维·服务器
sm_926787058 小时前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
by209998 小时前
C++ 多态:同一个基类接口,调用不同的函数
开发语言·c++·经验分享·多态
‎ദ്ദിᵔ.˛.ᵔ₎8 小时前
linux 进程信号 (上)
linux·服务器
15Moonlight9 小时前
Linux网络(02):Socket 编程 UDP
linux·网络·udp
colinu9 小时前
C++ 异步任务与线程生命周期:`std::async`、`future`、`thread`、`jthread` 与协作式退出
java·jvm·c++
wuminyu9 小时前
ForkJoinPool窃取线程在扫描其他WorkQueue时的随机采样算法与Phase线程挂起唤醒机制解析
java·linux·c语言·jvm·c++
longlongzihan9 小时前
链表找环:Floyd 判圈算法(LeetCode 141 & 142 )
c++·算法·leetcode·链表
liulilittle10 小时前
Linux 下 select 测试函数
linux·服务器·网络·数据库·c++·select·c
DongQiShanRen10 小时前
玄龙(上):TICK 主循环——意识心跳怎么跳
linux·jvm·数据库·人工智能·数据挖掘·rust