仿muduo库实现高并发服务器----EventLoop与线程整合起来

发布时间:2026/7/11 14:51:39

仿muduo库实现高并发服务器----EventLoop与线程整合起来 目录一、目的二、含义三、功能四、成员变量五、成员函数六、Loopthread1、目的2、功能3、成员变量4、成员函数一、目的EventLoop模块与线程是一一对应的EventLoop实例化的对象在构造的时候就会初始化_thread_id而后边当运行一个操作的时候判断当前是否运行在eventloop模板对应的线程中就是将线程ID与EventLoop模板中的thread_id进行一个比较相同就表示在同一个线程不同就表示当前运行线程并不是EventLoop线程二、含义EventLoop模板在实例化对象的时候必须在线程内部EventLoop实例化对象时会设置自己的thread_id,如果我们先创建多个EventLoop对象然后创建了多个线程将各个线程的id,重新给Event Loop进行设置 存在问题在构造EventLoop对象到设置新的thread_id期间将是不可控的因此我们必须先创建线程然后再线程的入口函数中去实例化EventLoop对象所以我们构造一个新模块LoopThread三、功能将EventLoop与thread整合到一起思想1、创建线程2、在线程中实例化EventLoop对象可以向外部返回实例化的EventLoop四、成员变量条件变量用于实现_loop获取的同步关系避免线程创建但是_loop还没有去实例化之前获取_loop*互斥锁线程idEventLoop指针变量这个对象需要在线程内部实例化五、成员函数构造创建线程设定线程入口地址线程入口地址获取Loop指针如果loop为NULL就一直阻塞六、Loopthread1、目的对所有的LoopThread进行管理及分配2、功能1、线程数量课配置注意事项在服务器中主从Reactor模型是主线程只负责新连接的获取从属线程负责链接的事件监控及处理因此当前的线程池有可能从属线程会数量为0也就是实现单Reactor服务器一个线程负责获取链接也负责链接的处理2、对所有的线程进行管理其实就是管理0个或多个LoopThread对象3、提供线程分配的功能当主线程获取一个新连接需要将新连接挂到从属线程上进行事件监控及处理假设有0个从属线程则直接分配给主线程的EventLoop进行处理假设有多个从属线程则采用RR轮思想进行线程的分配将对应线程的EventLoop获取到设置给对应的Connection3、成员变量从属线程的数量保存所有的LoopThreadPoolEventLoop运行在主线程从属线程数量为0所有的操作都在baseLoop中进行从属线程数量大于0则从_loops中进行EventLoop分配下一个线程id4、成员函数构造设置线程的数量创建所有从属线程下一个线程class LoopThread { private: std::mutex _mutex; std::condition_variable _cond; std::thread _thread; EventLoop *_loop; void ThreadEntry() { EventLoop loop; { std::unique_lockstd::mutex lock(_mutex); _loop loop; _cond.notify_all(); } loop.Start(); } public: LoopThread() : _loop(NULL), _thread(std::thread(LoopThread::ThreadEntry, this)) { } EventLoop *GetLoop() { EventLoop *loop NULL; { std::unique_lockstd::mutex lock(_mutex); _cond.wait(lock, []() { return _loop ! NULL; }); loop _loop; } return loop; } }; class LoopThreadPool { private: int _thread_cout; std::vectorLoopThread * _threads; EventLoop *_baseloop; std::vectorEventLoop * _loops; int _next_loop_idx; public: LoopThreadPool(EventLoop *baseloop) : _thread_cout(0), _next_loop_idx(0), _baseloop(baseloop) { } void SetThreadCount(int cout) { _thread_cout cout; } void Creat() { if (_thread_cout 0) { _threads.resize(_thread_cout); _loops.resize(_thread_cout); for (int i 0; i _thread_cout; i) { _threads[i] new LoopThread(); _loops[i] _threads[i]-GetLoop(); } return; } } EventLoop *NextLoop() { if (_thread_cout 0) return _baseloop; _next_loop_idx (_next_loop_idx 1) % _thread_cout; return _loops[_next_loop_idx]; } };

相关新闻