Muduo库源码剖析
粪逗er
努力的人运气不会差
展开
-
muduo_base代码剖析之Timestamp、AtomicIntegerT、Exception
Timestamp类封装Timestamp.cc、Timestamp.hless_than_comparable要求实现<,可自动实现< 、<=、 >=BOOST_STATIC_ASSERT 编译时断言(判断真假)使用PRId64int64_t用来表示64位整数,在32位原创 2018-11-20 17:03:13 · 227 阅读 · 0 评论 -
muduo_net代码剖析之EventLoopThread
说明:理解[muduo_net代码剖析之EventLoop]是学习本文的基础原创 2018-11-26 13:37:57 · 301 阅读 · 1 评论 -
muduo_net代码剖析之EventLoopThreadPool(main+sub)
引言本文讲解的EventLoopThreadPool类,实际上就是Multiple-Reactor模型即:mainReactor用于listen新的客户端连接接收到的连接,通过RR方式选择并按插在subReactor上,由subReactor处理该连接的读写事件代码解析二话不说,先看几个比较关键的函数class EventLoopThreadPool : boost::nonc...原创 2018-11-26 17:01:39 · 294 阅读 · 0 评论 -
muduo_net代码剖析之TcpConnection
1、TcpServer在接收并建立连接的过程中,TcpConnection做了什么工作?经过前文对TcpServer类的讲解以及上图的展示,我们知道:TcpConnection是TcpServer的一个成员变量当TcpServer接收到client的连接请求后,将会回调newConnection()函数:先创建TcpConnection对象用来与client连接,再执行connectEs...原创 2018-11-29 17:36:07 · 327 阅读 · 0 评论 -
muduo库使用示例之聊天服务器(下)
借用shared_ptr实现copy on writeshared_ptr是引用计数智能指针,如果当前只有一个观察者,那么引用计数为1,可以用shared_ptr::unique()来判断对于共享资源有两个端,分别是read端、write端对于write端,如果发现引用计数为1(说明只有一个写者访问它),这时可以安全地修改对象,不必担心有人在读它对于read端,在读之前把引用计数加1,读...原创 2018-12-04 10:11:26 · 361 阅读 · 0 评论 -
muduo_net代码剖析之Acceptor
Acceptor类的简单介绍类Acceptor用来listen、accept,并调用回调函数来处理新到的连接构造函数Acceptor创建非阻塞的listen socket和channel,并且将Acceptor::handleRead函数设置为acceptChannel_的Read CallbackAcceptor::Acceptor(EventLoop* loop, const In...原创 2018-11-26 17:15:54 · 197 阅读 · 0 评论 -
muduo_net代码剖析之连接器Connector
Connecto、TcpClient原创 2018-11-29 20:51:07 · 306 阅读 · 0 评论 -
muduo_net代码剖析之TcpServer
引言TcpServer 类是用来accept客户端的连接的源码分析成员变量 typedef std::map<string, TcpConnectionPtr> ConnectionMap; EventLoop* loop_; // the acceptor loop原创 2018-11-26 20:47:49 · 334 阅读 · 0 评论 -
muduo库使用示例之3种网络模型(Sudoku求解服务器)
muduo库网络模型使用代码存放在muduo-master\examples\sudoku下reactor(一个IO线程)multiple reactor(多个IO线程)one loop per thread + thread pool (多个IO线程+计算线程池)<单线程版本>数独求解服务器sudoku数独求解服务器MuduoManual.pdf (P35)假设有一...原创 2018-12-02 16:50:44 · 548 阅读 · 0 评论 -
muduo库使用示例之文件传输filetransfer
文件传输(发送)有下面3个版本,代码实现在muduo\examples\filetransfer目录中。版本1:一次性将文件读入内存并发送一次性将文件读入内存中的string fileContent,一次性调用send(const string&)发送完毕。==> 缺点:消耗内存很大注解1:send函数是非阻塞的,立刻返回。不用担心数据什么时候发送给对等方。这个由网络库mud...原创 2018-12-02 17:36:20 · 1160 阅读 · 1 评论 -
muduo之当析构函数遇见线程安全
一、当析构函数遇到多线程当一个对象能被多个线程同时看到时,那么对象的销毁时机就会变得模糊不清,可能出现多种竞态条件:① 在即将析构一个对象时,如何知道此时是否有别的线程正在执行该对象的成员函数?② 如何保证在执行成员函数期间,对象不会被另一个线程析构?③ 在调用某个对象的成员函数之前,如何得知该对象还活着?它的析构函数会不会碰巧执行到一半?二、对象的销毁太难2.1 作为数据成员的mut...原创 2018-12-04 19:19:32 · 662 阅读 · 0 评论 -
muduo库使用示例之聊天服务器(上)
聊天服务器示意图实现的功能:任何一个Client给Server发送消息后,Server都会将该消息回射给连接上来的所有Client原创 2018-12-02 18:49:26 · 1313 阅读 · 1 评论 -
muduo_net代码剖析之Buffer类的设计
epoll使用level trigger(LT模式)的原因① 与poll兼容② LT模式不会发生漏掉事件的BUG,但POLLOUT事件不能一开始就关注,否则会出现busy loop,而应该在write无法完全写入内核缓冲区的时候才关注,将未写入内核缓冲区的数据添加到应用层output buffer,直到应用层output buffer写完,写完后停止关注POLLOUT事件③ 读写的时候不必等...原创 2018-11-27 19:19:16 · 466 阅读 · 0 评论 -
muduo_net代码剖析之TcpClient
有了Connector,TcpClient的实现就不难了,它的代码与TcpServer甚至有几分相似,只不过TcpClient只管理一个TcpConnection。先谈几个要点:TcpClient具备TcpConnection断开之后重新连接的功能,加上Connector具备反复尝试连接的功能,因此客户端和服务器的启动顺序无关紧要。可以先启动客户端,一旦服务器启动,半分钟之内即可恢复连接(由C...原创 2018-12-01 15:34:18 · 520 阅读 · 0 评论 -
muduo_base代码剖析之StringPiece
为什么要有这个StringPiece类? StringPiece类是google提供的一个类。在网络传输中,如果传递一个很大的char*类型的字符串,那么这个很大的内存块需要在网络上进行传输;这么一块字符串虽然小,但是对于网络上高性能传输上,小小的因素都将会带来网络负载的加重,因此,使用StringPiece类对string/char*进行封装,封装成const char* ptr_ + in...原创 2018-11-26 09:09:56 · 768 阅读 · 0 评论 -
muduo_net代码剖析之定时器Timer*类
定时函数,用于让程序等待一段时间或安排计划任务timefd_*入选的原因:sleep/alarm/usleep在实现时可能用了信号SIGALARM,在多线程程序中处理信号是个相当麻烦的事情,应尽量避免nanosleep和clock_nanosleep是线程安全的,但是在非阻塞网络编程当中,绝对不能用让线程挂起的方式来等待一段时间,程序会失去响应。正确的做法是注册一个时间回调函数getti...原创 2018-11-23 16:09:10 · 256 阅读 · 0 评论 -
muduo_base代码剖析之Thread/Mutex/MutexLockGuard /Condition/CountDownLatch
(1) 线程Thread.h、Thread.cc代码解读测试代码 ./test/Thread_test.cCurrentThread.hnamespace CurrentThread{# __thread修饰的变量是线程局部存储的,每个线程都有一份__thread int t_cachedTid = 0; # 线程真实pid(tid)的缓存,是为 #了提高获取tid的效...原创 2018-11-20 21:02:44 · 323 阅读 · 0 评论 -
muduo_base代码剖析之BlockingQueue、BoundedBlockingQueue
BlockingQueue.h 无界队列代码功能:使用条件变量+互斥锁,实现无界队列,保证对临界资源(队列)的访问是安全的template<typename T>class BlockingQueue : noncopyable{private: mutable MutexLock mutex_; //互斥锁,保护共享的队列queue_ Condition .原创 2018-11-21 10:59:26 · 233 阅读 · 0 评论 -
muduo_base代码剖析之ThreadPool线程池
线程池的问题本质上也是生产者消费者模型问题生产者生产产品的过程,实际上就是由程序员向任务队列中任务的过程(需要程序员控制),实现代码见下: 1. print函数是程序员自己手动定义的任务函数 2. run(Task task)接口的功能是将task添加到任务队列中,并唤醒等待任务的线程 pool.run(print); //该句话表示:程序员手动将print任务添加到任务队列 ...原创 2018-11-21 15:22:53 · 259 阅读 · 0 评论 -
muduo_base代码剖析之线程安全的Sigleton模式
预备知识什么是单例模式?一个类有且仅有一个实例,并且对外提供统一的访问该实例的接口单例模式分为饿汉式、懒汉式,对于饿汉式要保证线程安全需要使用double-check lock机制muduo中实现的线程安全的Sigleton类,没使用锁,而使用效率更高的线程一次性初始化函数上述讲解的内容比较基础,不懂的同学可以自行百度moduo的线程安全的Sigleton类的源码分析使用一次性...原创 2018-11-21 16:04:52 · 244 阅读 · 0 评论 -
muduo_base代码剖析之线程特定数据的封装ThreadLocal
线程特定数据 (线程内私有的全局变量)来源在单线程程序中,我们经常要用到“全局变量”以实现多个函数间能共享数据在多线程环境下,由于数据空间是共享的,因此全局变量也为所有线程共享但有时应用程序设计中有必要提供线程私有的全局变量,仅在某个线程中生效,但却可以跨多个函数访问POSIX线程库通过维护一定的数据结构来解决这个问题,这些数据称为Thread-specific Data / TSD线...原创 2018-11-21 16:49:31 · 194 阅读 · 0 评论 -
muduo_base代码剖析之线程本地单例对象ThreadLocalSingleton
线程本地单例对象的封装ThreadLocalSingleton<T>,也就是说,每一个线程都有一个T类型的单例对象直接看测试代码#include <muduo/base/ThreadLocalSingleton.h>#include <muduo/base/CurrentThread.h>#include <muduo/base/Thread.h...原创 2018-11-21 18:04:18 · 243 阅读 · 0 评论 -
muduo_base代码剖析之Socket API封装
日志作用Linux C下的程序员,很少使用gdb调试程序,一般都使用日志调试程序程序错误分为:编译时错误、运行时错误(将errno保存到日志中)、逻辑错误(最难调试,将程序的运行状态都存到日志)开发过程中调试错误更好的理解程序:运行流程运行过程中诊断系统故障并处理记录系统运行状态日志级别TRACE:指出比Debug粒度更细的一些信息事件(开发过程中使用)Debug:指出...原创 2018-11-21 19:33:58 · 303 阅读 · 0 评论 -
**10种大并发服务器设计方案与muduo库网络模型使用
常见并发服务器方案循环式/迭代式服务器:短链接缺点:无法充分利用多核CPU,不适合执行时间较长的服务并发式服务器:长连接(1)主进程负责监听client的连接请求(2)当连接建立后,新fork一个子进程与client通信适应场景:适用于执行时间比较长的服务prefork服务器(1)父进程进行listen,然后先fork出大量的子进程===&amp;amp;amp;amp;amp;amp;amp;gt;此时,父子进程都lis...原创 2018-11-21 20:03:09 · 1022 阅读 · 0 评论 -
muduo_net代码剖析之事件处理器Channel
Channel是selectable IO channel,负责注册与响应IO事件,它不拥有file descriptor,不用负责将其关闭。Channel类一般不单独使用,它常常包含在其他类中(Acceptor、Connector、EventLoop、TimerQueue、TcpConnection)使用个人理解:可以将Channel理解成是一种muduo库中的文件描述符,因此使用Chan...原创 2018-11-23 17:04:16 · 634 阅读 · 0 评论 -
muduo_net代码剖析之EventLoop
TCP网络编程本质TCP网络编程最本质的是处理三个半事件连接建立:服务器accept(被动)接收连接,客户端connect(主动)发起连接连接断开:主动断开(close、shutdown),被动断开(read返回0)消息到达:文件描述符可读消息发送完毕:这算半个。对于低流量的服务,可不必关心这个事件;这里的发送完毕是指数据写入操作系统缓冲区,将由TCP协议栈负责数据的发送与重传,不代表...原创 2018-11-23 18:40:47 · 282 阅读 · 0 评论 -
muduo库介绍与安装
全部代码5000行 (不含测试)线程安全,原生支持多核多线程不考虑移植性,不跨平台,只支持Linux,不支持Windows主要支持x86-64,兼顾IA32不支持UDP,只支持TCP不支持IPv6,只支持IPv4不考虑广域网应用,只考虑局域网(实际上muduo也可以用在广域网上)不考虑公网,只考虑内网。不为安全性做特别的增强只支持一种使用模式:non-blocking IO + o...原创 2018-11-20 11:44:04 · 1323 阅读 · 0 评论 -
muduo基于对象编程风格[与]面向对象编程风格对比
基于对象编程风格,使用boost bind/function,替代了mem_fun,ptr_fun,bind1st,bind2nd等函数示例:将一个函数接口,转换为另一种函数接口#include &amp;amp;lt;iostream&amp;amp;gt;#include &amp;amp;lt;boost/function.hpp&amp;amp;gt;#include &amp;amp;lt;boost/原创 2018-11-20 13:21:23 · 309 阅读 · 0 评论 -
muduo_net代码剖析之Http相关类介绍
响应类HttpResponseclass Buffer;//响应类class HttpResponse : public muduo::copyable{private: std::map&amp;amp;amp;amp;amp;amp;lt;string, string&amp;amp;amp;amp;amp;amp;gt; headers_; //header列表 HttpStatusCode statusCode_; //状态响应码原创 2018-12-01 19:20:34 · 304 阅读 · 0 评论