Muduo网络库
Muduo网络库
~青萍之末~
弱者总有弱者的理由
展开
-
【muduo】net篇---TcpServer
TcpServer在创建的过程中,首先new出来自己的核心组件(Acceptor,loop,connectionMap,threadPool)之后TcpServer会向Acceptor注册一个新连接到来时的Connection回调函数。一旦接受到一个client的连接,就会调用TcpServer::newConnection()函数。这个函数使用round-robin算法从EventLoopT...原创 2019-02-21 10:37:04 · 982 阅读 · 0 评论 -
【muduo】net篇---EventLoopThread和EventLoopThreadPool
EventLoopThread是事件循环线程,包含一个Thread对象,一个EventLoop对象。在构造函数中,把EventLoopThread::threadFunc 注册到Thread对象中(线程启动时会回调)。 EventLoopThreadPool是事件循环线程池,管理所有客户端连接,每个线程都有唯一一个事件循环。可以调用setThreadNum设置线程的数目。#include...原创 2019-02-20 22:36:18 · 1412 阅读 · 0 评论 -
【muduo】net篇---EventLoop
EventLoop类调用Poller::poll()进行I/O复用,返回活跃事件列表,然后遍历该列表,依次调用每一个活跃Channel的事件处理函数handleEvent(),最终回调了TcpConnection注册过来的函数。#include <muduo/net/EventLoop.h>#include <muduo/base/Logging.h>#inclu...原创 2019-02-20 22:30:35 · 663 阅读 · 0 评论 -
【muduo】net篇---Poller
Poller类负责更新某一个Channel(或者说套接字)上对应的事件,通过epoll_wait()函数返回有事件发生的套接字,设置Channel上的事件(revents_),并添加到激活事件列表中。#include <muduo/net/poller/EPollPoller.h>#include <muduo/base/Logging.h>#include &l...原创 2019-02-20 22:15:40 · 637 阅读 · 0 评论 -
【muduo】net篇---Channel
Channel类和文件描述符一一对应,它保存了所关心的文件描述符(fd_)、关注的事件(从TcpConnection那边注册的readCallback_、writeCallback_等)、poller返回的事件。Channel类对象被传到Poller类中进行poll(), 返回时,成员变量revents_会被改写,handleEvent正是根据这个revents_来执行读/写/出错操作(回调T...原创 2019-02-20 21:48:05 · 1567 阅读 · 0 评论 -
【muduo】net篇---TcpConnection
TcpConnection类主要负责封装一次TCP连接,向Channel类注册回调函数(可读、可写、可关闭、错误处理),将来当Channel类上的事件发生时,调用相应的回调函数进行数据收发或者错误处理。 TcpConnection是使用shared_ptr来管理的类,因为它的生命周期模糊。TcpConnection表示已经建立或正在建立的连接,建立连接后,用户只需要在上层类如TcpServ...原创 2019-02-20 21:03:15 · 1466 阅读 · 0 评论 -
【muduo】net篇---Acceptor
Acceptor类是属于内部类。既然这个类是管理监听套接字的,那么这个监听套接字的生命周期就是由Acceptor类来管理。 Acceptor类主要负责监听连接请求,调用listen()接口时,通过Channel::enableReading()把socket的描述符加到poller(I/O复用器)中。当有新连接到达时,先调用系统函数accept(),再回调函数newConnectionCa...原创 2019-02-20 20:26:58 · 392 阅读 · 0 评论 -
【muduo】TCP分包和Buffer类的设计
文章目录一、TCP分包问题1、长连接和短连接2、长连接和短连接的分包方法3、长连接和短连接的应用场景二、TCP粘包问题三、Buffer类的设计与使用1、为什么需要应用层buffer?2、如何设计并使用应用层Buffer?3、Buffer类的设计一、TCP分包问题 在TCP这种字节流协议上做应用层分包是网络编程的基本要求。分包是指在发生一个消息(message)或者一帧(frame)数据时,通...原创 2019-02-20 16:20:11 · 1383 阅读 · 1 评论 -
【muduo】常见的并发网络服务程序设计方案
文章目录一、IO复用1、select模型2、poll模型3、epoll模型二、单线程Reactor三、Reactor + ThreadPool四、Multiple Reactors(one loop per thread)一、IO复用 目前常用的IO复用模型有三种:select,poll,epoll。1、select模型 说的通俗一点就是各个客户端连接的文件描述符也就是套接字,都被放到...原创 2019-02-20 14:39:09 · 409 阅读 · 0 评论 -
双缓冲异步日志(Async Logging)
一、日志系统简介 日志通常用于故障诊断和追踪(trace),也可用于性能分析。日志通常是分布式系统中事故调查时的唯一线索, 用来追寻蛛丝马迹, 查出原凶。【日志需要记录的内容】:收到每条内部消息的ID(还可以包括关键字段、长度、hash等);收到的每条外部消息的全文;发出每条消息的全文, 每条消息都有全局唯一的id;关键内部状态的变更, 等等。【一个日志文件可分...原创 2019-01-16 17:16:30 · 6034 阅读 · 8 评论 -
【muduo】base篇---ThreadLocal
一、线程特定数据和线程本地存储 线程本地数据(局部数据/私有数据/线程中特有的线程存储),和__thread类似,虽然__thread简单,但容易不正确使用。 线程存储:每个线程都有各自的线程存储,直到线程被销毁(或者主动调用函数销毁)。线程存储既不是全局变量(不同的线程有各自的线程存储,而且也不能相互访问)、也不是static变量(线程函数中的static变量可以被多个线程修改)也不是局...原创 2019-01-15 21:27:46 · 451 阅读 · 0 评论 -
【muduo】base篇---ThreadPool
一、线程池简介 线程池本质上也是生产者消费者问题:生产者线程向任务队列添加任务,消费者线程(在线程队列中)从任务队列取出任务去执行。二、ThreadPool源码#ifndef MUDUO_BASE_THREADPOOL_H#define MUDUO_BASE_THREADPOOL_H#include &lt;muduo/base/Condition.h&gt;#include &...原创 2019-01-15 21:14:42 · 412 阅读 · 0 评论 -
【muduo】base篇---BlockingQueue和BounderBlockingQueue
文章目录一、经典的生产者和消费者模型二、BlockingQueue简介(普通队列)三、BlockingQueue源码四、BounderBlockingQueue简介(环形队列)五、BounderBlockingQueue源码一、经典的生产者和消费者模型二、BlockingQueue简介(普通队列) BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些...原创 2019-01-15 21:05:36 · 401 阅读 · 0 评论 -
【muduo】base篇--CountDownLatch(倒计时计数器)
一、倒计时计数器的作用 CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。假设我们周末要去旅游,出游前需要提前订好机票、巴士和酒店,都订好后就可以出发了,这个用代码怎么实现?可以用CountDownLatch。主线程发起多个子线程,等这些子线程各自都完成一定的任务之后,主线程才继续执行。通常用于主线程等待多个子线程完成初始...原创 2019-01-15 19:44:09 · 1245 阅读 · 1 评论 -
【muduo】base篇--Thread、Mutex、Condition
文章目录一、Thread类二、Mutex类三、Condition类一、Thread类#include <muduo/base/Thread.h>#include <muduo/base/CurrentThread.h>#include <muduo/base/Exception.h>#include <muduo/base/Logging.h&...原创 2019-01-15 19:33:49 · 581 阅读 · 0 评论 -
【muduo】base篇---Atomic
文章目录一、原子性操作的概念二、Atomic源码分析三、volatile关键字详解1、volatile关键字的概念2、volatile与多线程有关系吗?3、计算机中内存、cache和寄存器之间的关系及区别4、volatile关键字的三大特性(1)易变性(2)不可优化(3)顺序性一、原子性操作的概念 所谓的原子操作,取的就是“原子是最小的、不可分割的最小个体”的意义,它表示在多个线程访问同一个...原创 2019-01-09 21:10:23 · 2129 阅读 · 0 评论 -
【muduo】面向对象编程风格 VS 基于对象编程风格(std::bind/function)
很多人没有区分“面向对象”和“基于对象”两个不同的概念。面向对象的三大特点(封装,继承,多态)缺一不可。通常“基于对象”是使用对象,但是无法利用现有的对象模板产生新的对象类型,继而产生新的对象,也就是说“基于对象”没有继承的特点。而“多态”表示为父类类型的子类对象实例,没有了继承的概念也就无从谈论“多态”。现在的很多流行技术都是基于对象的,它们使用一些封装好的对象,调用对象的方法,设置对象的属...转载 2019-01-06 19:40:26 · 517 阅读 · 0 评论 -
【muduo】C++多线程系统编程精要
文章目录一、基本线程原语的选用二、C/C++系统库的线程安全性三、Linux上的线程标识四、线程的创建与销毁的守则五、善用__thread关键字六、多线程与IO七、用RAII包装文件描述符八、多线程与fork()九、多线程与signal十、总结 学习多线程编程面临的最大思维方式的转变有两点:当前线程可能被切换出去, 或者说被抢占(preempt)了。当线程被切换出去回来继续执行下一条语句...原创 2019-01-06 16:37:15 · 1025 阅读 · 0 评论 -
【muduo】线程同步精要
文章目录一、互斥量(mutex)1、互斥量的使用原则2、只使用非递归的mutex3、死锁二、条件变量(condition variable)三、读写锁、信号量四、sleep(3)不能保证同步五、总结 线程同步的四项原则, 按重要性排列:首要原则是尽量最低限度地共享对象, 减少需要同步的场合。一个对象能不暴露给别的线程就不要暴露如果暴露就优先考虑immutable对象(const);实在不...原创 2018-12-28 21:46:14 · 487 阅读 · 0 评论 -
【muduo】线程安全的对象生命期管理
文章目录一、当析构函数遇到多线程二、对象的创建很简单三、销毁太难四、原始指针有何不妥五、神器 shared_ptr/weak_ptr1、shared_ptr的关键点2、shared_ptr的线程安全六、系统地避免各种指针错误七、shared_ptr 技术与陷阱八、小结一、当析构函数遇到多线程 当一个对象能被多个线程同时看到时,那么对象的销毁时机就会变得模糊不清,可能出现多种竞态条件(race...原创 2018-12-28 20:56:50 · 645 阅读 · 0 评论 -
muduo网络库的安装和使用
一、安装依赖库# 安装cmakesudo apt-get install cmake # 安装boostsudo apt-get install libboost-dev libboost-test-dev# 三个非必须的依赖库:curl、c-ares DNS、Google Protobuf sudo apt-get install libcurl4-openssl-dev li...原创 2018-12-20 19:29:37 · 2161 阅读 · 2 评论