muduo源码分析之Acceptor

Class Acceptor:用于accept一个TCP连接,并通过回调函数通知使用者。

accept接受成功后通知TCP连接的使用者,Acceptor主要是供TcpServer使用的,其生命期由后者控制,一个Acceptor相当于持有服务端的一个socket描述符,该socket可以accept多个Tcp客户端连接。

Acceptor在构造时候会创建一个socket描述符--acceptSocket_,并通过一个Channel管理socket描述符(channel.setReadcallback()),

一旦该socket可读就会调用Channel::handldEvent()将会调用Acceptor::handleRead(),执行accept一个Tcp客户连接,

还会将新的Tcp客户连接和客户端地址通过回调函数newConnectionCallback()传给Tcp客户连接的使用者----Tcpserver,

这里的回调函数newConnectionCallback是在Acceptor::setNewConnectionCallback(newConnectionCallback)指定的,值得注意的是这里又是统一事件源的思想,通过channel和poller管理事件,

Acceptor::listen()的工作是:启动acceptSocket_::listen()监听socket描述符,并通过Channel::enableReading()将socket的可读事件注册到Poller的集合中。

muduo源码分析之Acceptor_第1张图片

muduo源码分析之Acceptor_第2张图片

Class EventLoopThread:开启一个线程执行EventLoop,语义和”oneLoop  per thread”相吻合。

一个程序也可以有不止一个IO线程,可以按优先级不同的socket分给不同的IO线程,避免优先级反转,在线程中运行EventLoop:loop(),其中关键的startloop()这个函数会返回新线程中Eventloop对象的地址,因此用条件变量来等待线程的创建和运行。

重点理解:该类中的互斥量和条件变量,这是因为线程A创建一个EventLoop Thread 对象后,运行EventLoop的线程已经开始创建了,可以通过EventLoopThread::startLoop()获取这个新的EventLoop对象,但若EventLoop线程还没创建好则会出错,所以在创建EventLoop完成后会执行conditition.notify()通知线程A,线程A调用EventLoopThread::startLoop()时调用condition.wait()等待,从而保证获取一个创建完成的EventLoop,毕竟线程A创建的EventLoop线程,A可能还会调用EventLoop执行一些任务回调。



你可能感兴趣的:(muduo源码分析)