E-COM-NET
首页
在线工具
Layui镜像站
SUI文档
联系我们
推荐频道
Java
PHP
C++
C
C#
Python
Ruby
go语言
Scala
Servlet
Vue
MySQL
NoSQL
Redis
CSS
Oracle
SQL Server
DB2
HBase
Http
HTML5
Spring
Ajax
Jquery
JavaScript
Json
XML
NodeJs
mybatis
Hibernate
算法
设计模式
shell
数据结构
大数据
JS
消息中间件
正则表达式
Tomcat
SQL
Nginx
Shiro
Maven
Linux
muduo源码分析
muduo源码分析
--EventLoop 类的实现
首先看EventLoop的具体实现,因为继承了boost::noncopyable。所以这个类是不可拷贝的。 从设计muduo的理念来看,oneloopperthread顾名思义每个线程只能有一个EventLoop对象,因此EventLoop的构造函数就会检查当前线程是否已经创建了其他EventLoop对象,遇到错误就终止程序(LOG_FATAL).EventLoop的构造函数会记住本对象所属的
yusiguyuan
·
2014-03-31 13:00
C++
网络编程
muduo源码分析
--buffer中的线程安全
在栈上准备了一个65536字节的extrabuf(这个空间是在readFd函数内部定义的,说以说是内部栈空间,在这个函数返回以后这个栈空间就会消失,属于临时变量),然后利用readv(0来读取数据,iovec有两块,第一块指向MuuodBuffer中的writable字节,另一快指向栈上extrabuf。这样如果读入的数据不多,那么全部都读到Buffer中去了;如果长度超过Buffer的writa
yusiguyuan
·
2014-03-29 10:00
C++
线程
网络编程
muduo源码分析
--数据发送
暂且已经明白在non-blocking+IOmultiplexing网络编程模型中应用层的buffer是必须的这个问题,看数据是怎么被发送的: 对于应用程序而言,它只管生成数据,它不应该去关心到底数据是一次性发送还是分成几次发送,这些应该由网络库操心,程序只要调用TcpConnection::send()就行了,网络库会负责到底。网络库应该接管这剩余的20KB数据,把它保存在该TCPconn
yusiguyuan
·
2014-03-28 16:00
C++
线程
网络编程
muduo源码分析
--数据在muduo中的旅程
在实例化一个EvenLoop之后,就会有两个socketfd(这两个套接字分别归属于两个Channel中,一个是异步唤醒的wakeFd,一个timequeue初始化的fd)被添加到监听队列中 数据发送的流程: 数据的发送主要靠异步唤醒,当主IO线程接受到一个新的连接后,在TcpServer中实例化一个TcpConnection,然后这个新的连接被挂载到某个线程池(EventLo
yusiguyuan
·
2014-03-28 14:00
C++
线程
服务器
网络编程
muduo源码分析
--TcpServer
从TcpServer分析,结果又回到了TcpServer来,但是这次是有目的而来,这次是分析在TcpServer类中如何使用EventLoopThreadPool。 原来我们再使用TcpServer的时候,除了自己再次封装外,还在主函数中自己实例化一个EventLoop,这个EventLoop是用来初始化TcpServer中的EvetnLoopThreadPool而存在的,就是作为Event
yusiguyuan
·
2014-03-27 22:00
C++
源码
线程
网络编程
muduo源码分析
--EventLoopThreadPool类
这个貌似是个池,池里全是EventLoopThread。貌似很强大 这个类对外的接口也很简单 一个构造函数,需要传递的是EventLoop 一个设置个数的函数setThreadNum,这个函数好像决定了开启几个EventLoopThread 一个start 从感觉上来看这个函数是按照numThreads_的数目来开启线程的,EventLoopThreadPool中有一个向
yusiguyuan
·
2014-03-27 15:00
C++
线程
类
网络编程
muduo源码分析
---EventLoopThread
这个类只有两个对外接口的函数,一个构造函数,一个开始Loop的函数类的内部成员: 一个Loop指针loop_(说明内部并没有实例化EventLoop) 一个线程 thread_ 一个锁 Mutex 一个条件变量cond_ 一个初始化回调callback_EventLoopThread初始化传递的是函数回调,同时开启一个线程,线程函数运行的就是实例化一个EventL
yusiguyuan
·
2014-03-27 14:00
C++
线程
网络编程
muduo源码分析
---EventLoop类
现在暂时记住TcpConnection是TcpServer中Acceptor关注的监听套接字上accept新连接后被初始化的一个对象,接下来分析下EventLoop 这个东西才是真正驱动库的核心,是别的类(EpollPollerAcceptor)帮助他完成了库的功能,看看内部是怎么实现的。EventLoop: 这个类中最重要的成员就是poller_,这个成员调用epoll_wait监听
yusiguyuan
·
2014-03-27 14:00
C++
线程
网络编程
muduo源码分析
--事件如何被关注的 EpollPoller Channel TcpServer
首先看TcpServer: 在这里肯定是有socketfd的,不然这个监听套接字是怎么被关注的呢!这样的操作时通过Accept来处理的Acceptor: 在这个类就是提供给TcpServer让其监听的,类中有Channel,也有一个Socket,有一个事件handleRead(),这个函数肯定是提供给Channel的,等到Acceptor中的socketfd有事件时,肯定是可读事件,调
yusiguyuan
·
2014-03-26 19:00
C++
c
线程
muduo源码分析
--事件回调层次是怎么传递的Tcpserver Channel TcpConnection
muduo库中的源码并不是很多,但是回调的处理非常巧妙,这里从事件激活(某个套接字上可读/可写)以后这个层次看回调怎么被调用的。首先从最大的EventLoop说起: EventLoop中拥有事件链表(每一个元素都是Channel),在loop函数中调用epoll_wait系统调用的时候,将EpollPollr中EventList,将这个链表中激活事件添加到EventLoop中的activeC
yusiguyuan
·
2014-03-26 19:00
C++
线程
网络编程
muduo源码分析
--详解muduo多线程模型
6.3 非阻塞网络编程应该用边沿触发(ET)还是电平触发(LT)?如果是电平触发,那么什么时候关注POLLOUT事件?会不会造成busy-loop?如果是边沿触发,如果和防止漏读造成的饥饿?epoll一定比poll快么?6.4 在finger的测试程序中,没有设置onConnection这个函数,就可以连接?6.6详解muduo多线程模型 方案0:accept+read/write 一
yusiguyuan
·
2014-03-26 11:00
C++
c
线程
网络编程
上一页
1
2
下一页
按字母分类:
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
其他