文章目录
一、LoopThreadPool模块
1.线程数量可配置(0或多个)
-
对所有的线程进行管理,其实也就是管理0个或多个LoopThread对象!
-
提供线程分配的功能!
二、实现思想
(一)功能
针对LoopThread设计一个线程池,便于管理。
(二)意义
对所有的LoopThread进行分配和管理!
(三)功能设计
1.线程数量可配置(0或多个)
注意事项:在服务器中,主从Reactor模型是 主线程只负责新连接获取,丛书线程负责新连接的事件监控以及处理!因此当前的线程池,有可能从属线程会数量为0,也就是实现单 Reactor服务器,一个线程及负责获取连接以及连接的处理!
-
对所有的线程进行管理,其实也就是管理0个或多个LoopThread对象!
-
提供线程分配的功能!
当主线程获取了一个链接,需要将新的线程挂到从属线程上进行事件监控以及管理!
假设0个从属线程,则直接分配给主线程的EventLoop,进行处理!
假设有多个丛书线程,则采用RR轮转!(将对应线程的EventLoop获取到,设置给对应的Connection)
三、代码
cpp
class LoopThreadPool {
private:
int _thread_count;
int _next_idx;
EventLoop *_baseloop;
std::vector<LoopThread*> _threads;
std::vector<EventLoop *> _loops;
public:
LoopThreadPool(EventLoop *baseloop):_thread_count(0), _next_idx(0), _baseloop(baseloop) {}
void SetThreadCount(int count) { _thread_count = count; }
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();
_loops[i] = _threads[i]->GetLoop();
}
}
return ;
}
EventLoop *NextLoop() {
if (_thread_count == 0) {
return _baseloop;
}
_next_idx = (_next_idx + 1) % _thread_count;
return _loops[_next_idx];
}
};