Muduo 笔记

来源:互联网 发布:linux删除oracle用户 编辑:程序博客网 时间:2024/06/05 06:21

Channel类
此类代表了一个fd,并且记录了fd对应的几个callback函数,当发生read event时调用什么函数,发生write event时调用什么函数。

Pooler类,此类为基类,具体函数定义参见PollPoller

pooler类主要的方法为poll函数,调用内核poll函数,阻塞等待某个fd发生某种事件,之后把发生的事件,对应的fd,返回给调用者。
另外一类方法是,注册关心的fd(updateChannel), 通过updateChannel实现,将channel对应的fd和关心的事件记录到pollfd中,然后填入pollfd的集合中(之后poll时,等待的就是这个pollfd集合)

EventLoop类

此类最关键的函数就是loop, 一个大循环
调用loop,等待发生某种事件
发生事件后,调用对应fd(channel)的处理函数

EventLoop类包含的成员对象,主要就是
一个looper对象(有loop方法)

包含的主要成员函数,主要就是能够向这个Eventloop中注册事件的方法
updateChannel(channel)
注册这个channel其实就是将其注册到looper中去,所以就是调用的looper.updateChannel

EventLoop, Looper, Channel 三者关系

EventLoop 拥有一个Looper,looper随着EventLoop对象的创建而生成,share_ptr

需要注意的是,looper和Channel对象构造的时候,需要传入其所属的EventLoop,所以channel对象也可以自己调用update,其中调用自己所属的eventloop对象的update函数,
loop_->updateChannel(this)的方式来更新自己。

当我们写多线程程序时,要有一个观念:区分开代码和线程。
代码是静态的,线程是动态的。
相邻的代码可能是在不同的线程执行的。

Thead类
当我们创建一个Thread类对象时,我们想做什么?
我们想异步的执行另外一个执行流。
这个类为我们提供便利,方便从本线程内控制此执行流。

EventLoopThread
此类包含一个Thread对象作为成员对象
包含一个thread入口函数
包含一个init call back

当我们定义一个包含一个Thread对象的类时, 我们想做什么?
EventLoopThread类就是一个包含一个Thread类对象成员的类,创建这个类也是为了方便的创建出另外一个执行流,执行流执行本类中定义的一个成员函数。EventLoopThread是为了方便的生成一个额外的线程,来执行EventLoop.loop()

需要注意的是,EventLoopThread生成一个对象后,执行对象的startLoop函数,会返回一个EventLoop指针,此指针对应的EventLoop对象是在其子线程(本线程生成的线程)的栈空间内,所以说使用EventLoopThread对象的线程并不拥有此对象。

为什么采用这种设计,是为了在主线程中方便的将任务分配给指定的looper去做,只需要调用looper对应的runInLoop, queueInLoop, runAt等函数。