Muduo 笔记

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类包含的成员对象,主要就是
一个poller对象(有pool方法)

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

EventLoop, Poller, Channel 三者关系

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

需要注意的是,poller和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等函数。
EventLooperThread对象 的start 方法执行后,会启动另外一个线程, 怎么给这个线程分配任务?一般是通过一个主线程和此线程共享的一个数据结构来给此线程发送一些函数对象, 让子线程执行。

looper对象的大循环方法,是在子线程中执行的, 调用looper.runat(),或者往此looper对象中update 一些 函数, 就会在对应的线程中执行

Eventloop 再理解
静态的理解, 这个类的对象主要包括一个大循环的方法
动态的理解, 一个event loop对象的生成, 代表着生成了一个异步线程, 开始无限循环来等待io事件,然后执行对应的操作。

EventLoop 代表了一个异步线程
Channel代表了一个fd, 保存了fd及其对应的call back函数
eventloop对象包括多个channel, 什么事件发生了,就调用对应的channel的对应方法

使用eventloop的时候, 要知道有两类线程, looper线程和调用者线程, looper线程是大循环的执行流, 调用者线程是main函数所在的主线程

looper线程中执行三类函数, 定时器, job, 和io handler

当你想把一个逻辑放在looper线程中执行时,可以考虑把他放进job, 还可以把它放进io handler,具体方法就是定义一个socketpair, 然后把读的一端包装成一个channel,注册到eventlooper中,可读时执行xxxx,然后在调用者线程中往socketpair中写入数据。触发eventlooper去执行对应的回调

对于一个使用eventloop的程序, 每行代码都要考虑, 这行代码将执行在looper线程中,还是调用者线程中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值