muduo源码分析之Acceptor
来源:互联网 发布:淘宝淘积木 编辑:程序博客网 时间:2024/05/17 03:48
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的集合中。
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源码分析之Acceptor
- Muduo之Acceptor源码分析笔记
- muduo::Acceptor、TcpServer分析
- 【muduo网络库学习】之Acceptor类分析
- muduo源码学习(20)-Acceptor封装
- muduo : Acceptor
- Muduo网络库源码分析(五)Acceptor和TcpServer类
- muduo源码分析之EventLoop
- muduo源码分析之TcpServer
- muduo源码分析之Buffer设计
- muduo源码分析之EventLoop::runInLoop()函数
- muduo源码分析之TcpConnection发送数据
- muduo源码分析之事件处理器-Channel
- Muduo之TcpConnection源码分析笔记
- muduo源码分析---EventLoopThread
- muduo源码分析--TcpServer
- muduo库源码分析
- muduo源码分析--详解muduo多线程模型
- NYOJ 224 灯光师小明
- SSnoCD (之四)
- 40个Java集合面试问题和答案
- centOS 安装nginx
- Struts2的执行流程--案例 使用struts2+hibernate实现客户列表查询
- muduo源码分析之Acceptor
- Average of Levels in Binary Tree问题及解法
- 【华为机试】计算字符个数
- 基于Swift的iOS应用程序开发:对字符串进行MD5加密
- opencv + cmake + vs2010 配置过程
- NYOJ 156 Hangover
- 【转载】猫都能学会的Unity3D Shader入门指南(二)
- vue axios用法
- HPU2017-2016级暑期集训练习赛