LoopThreadPool
LoopThread 和 LoopThreadPool 是多线程事件驱动模型中的核心组件,用于管理多个 EventLoop 实例(每个绑定一个独立线程),实现任务的负载均衡。两者配合使用,前者负责 “单个线程 + EventLoop” 的绑定,后者负责 “多个线程 + EventLoop” 的池化管理。
LoopThread 模块(单线程 EventLoop 封装)
(结合上一篇解析,此处提炼核心作用)LoopThread 是 “线程 + EventLoop” 的最小单元。
功能是:
在新线程中创建并启动 EventLoop(确保 EventLoop 与线程绑定,满足线程亲和性)。
通过 mutex + condition_variable 解决 “外部线程获取未初始化的 EventLoop” 的同步问题(通过 GetLoop() 安全获取 EventLoop 指针)。
LoopThreadPool 模块(多线程 EventLoop 池)
LoopThreadPool 是对 LoopThread 的池化管理,用于创建多个 EventLoop 线程,实现任务的分发(如网络连接的负载均衡)。
核心成员变量解析
| _thread_count | int | 从属线程(工作线程)的数量(由 SetThreadCount 设置)。 |
| _next_idx | int | 下一个要分配的 EventLoop 索引(用于轮询分发任务)。 |
| _baseloop | EventLoop* | 主线程的 EventLoop(若未创建从属线程,所有任务都由主线程处理)。 |
| _threads | std::vector<LoopThread*> | 存储所有 LoopThread 实例(每个对应一个工作线程)。 |
| _loops | std::vector<EventLoop*> | 存储所有工作线程的 EventLoop 指针(通过 LoopThread::GetLoop() 获取)。 |
构造函数(LoopThreadPool(EventLoop *baseloop))
LoopThreadPool(EventLoop *baseloop) : _thread_count(0), _next_idx(0), _baseloop(baseloop) {}
作用:初始化线程池,绑定主线程的 EventLoop(_baseloop)。
初始状态:_thread_count=0(默认不创建从属线程),_next_idx=0(分发索引从 0 开始)。
设置线程数量(SetThreadCount(int count))
void SetThreadCount(int count) {
_thread_count = count; // 设置要创建的从属线程数量
}
作用:指定线程池的工作线程数量(需在 Create() 之前调用)。
创建所有从属线程(Create())
void Create() {
if (_thread_count > 0) { // 若需要创建从属线程
_threads.resize(_thread_count); // 调整容器大小
_loops.resize(_thread_count);
for (int i = 0; i < _thread_count; i++) {
_threads[i] = new LoopThread(); // 创建LoopThread(启动新线程)
_loops[i] = _threads[i]->GetLoop(); // 获取新线程的EventLoop指针
}
}
return;
}
核心逻辑:批量创建 LoopThread 实例,并存入 _threads;同时获取每个 LoopThread 中的 EventLoop 指针,存入 _loops。
细节:
每个 LoopThread 的创建会启动一个新线程,并在新线程中初始化 EventLoop(通过 ThreadEntry 函数)。
_loops 存储的是所有工作线程的 EventLoop 指针,后续用于任务分发。
轮询获取下一个 EventLoop(NextLoop())
EventLoop *NextLoop() {
if (_thread_count == 0) { // 若没有从属线程,返回主线程的EventLoop
return _baseloop;
}
// 轮询选择下一个EventLoop(负载均衡)
_next_idx = (_next_idx + 1) % _thread_count;
return _loops[_next_idx];
}
核心作用:以 “轮询(Round-Robin)” 方式从线程池中选择一个 EventLoop,实现任务的负载均衡。
场景:例如服务器接收到新的客户端连接时,通过 NextLoop() 选择一个工作线程的 EventLoop 来管理该连接,避免单线程压力过大。
总结:、两个模块的协作流程(完整工作链路)
初始化线程池:
主线程创建 LoopThreadPool,并传入主线程的 EventLoop(_baseloop)。
调用 SetThreadCount(N) 设置工作线程数量(如 N=4)。
调用 Create() 批量创建 N 个 LoopThread:
每个 LoopThread 启动一个新线程,并在新线程中初始化 EventLoop。
_loops 容器存储这 N 个 EventLoop 的指针。
任务分发:
当有新任务(如客户端连接、定时任务)需要处理时,主线程调用 NextLoop()。
NextLoop() 以轮询方式从 _loops 中选择一个 EventLoop(如第 1 次返回 _loops[0],第 2 次 _loops[1],以此类推)。
任务通过选中的 EventLoop 的 RunInLoop 方法,在对应的工作线程中执行。
无工作线程的情况:
若 _thread_count=0,NextLoop() 直接返回 _baseloop,所有任务由主线程处理(适用于简单场景)。
LoopThread:封装 “单线程 + EventLoop”,解决线程与 EventLoop 的绑定和初始化同步问题。
LoopThreadPool:管理多个 LoopThread,通过轮询算法分发任务,实现多线程事件驱动的负载均衡。
两者结合是多线程 Reactor 模式的经典实现。





