您的位置:首页 > 汽车 > 新车 > 全国高校教师网络培训中心_品牌建设的内容有哪些_百度知道在线_优化seo方案

全国高校教师网络培训中心_品牌建设的内容有哪些_百度知道在线_优化seo方案

2025/2/6 16:25:59 来源:https://blog.csdn.net/m0_52329237/article/details/144332365  浏览:    关键词:全国高校教师网络培训中心_品牌建设的内容有哪些_百度知道在线_优化seo方案
全国高校教师网络培训中心_品牌建设的内容有哪些_百度知道在线_优化seo方案

主从reactor架构

在这里插入图片描述
一般的一个网络IO库都是主从reactor模式,即主线程中有一个MainReactor,其负责监听ListenFd,当接受到新的用户连接时,返回的clientfd并不会加入的MainReacotr,而是在子线程(这里称为IO线程)中,创建一个新的event_loop(即从Reactor, subreacotr),将clientfd加入到此SubReactor中,这样的架构称为主从reactor架构。这里阐述从Reactor的设计思路。(Reactor即event_loop)

IOThread

每一个从Reactor都需要一个IOThread来运行, 在这个IOThread中,需要放置一个event_loop,
在IOThread的构造函数中,初始化这个event_loop,之后开启这个event_loop,让其陷入epoll_wait中,epoll_wait等待的fd即上述的clientfd。考虑epoll_wait会阻塞,如果在IOThread中直接开启event_loop,则会阻塞创建的IOThread的地方,当然调用者可以在一个新的线程中创建IOThread, 但这样多少不方便了。
所以在IOThread中,会创建一个子线程,在子线程中创建、开启event_loop,这样调用IOThread的地方就变成异步了,创建IOThread对象后就返回。

考虑线程同步原因,可能IOThread返回后,event_loop创建好,所以加入一个信号量,当event_loop创建好,IOThread对象才构建好,可以返回。

考虑event_loop有时需要我们自主的选择开启,在IOThread中加入一个start函数,调用start函数后even_loop才开始真正的进行事件监听,所以需要再添加一个信号量。

这里需要两个信号量,一个用来控制event_loop创建好后,IOThread对象构造完成,可以返回,一个用来控制开启event_loop循环。

IOThreadGroup

可预先创建好多个IOThread对象放入IOThreadGroup中,在IOThreadGroup内部创建一个vector对象,内部存如IOThread对象,提供一个getIOThread方法,当客户端连接,需要IOThread时,直接调用getIOThread方法,返回一个可用的IOThread对象,用来充当从reactor。

可参考代码:
https://github.com/LIMengjie1/rocketrpc/tree/main/rocket/net
其中io_thread.cpp 和io_thread_group.cpp

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com