
moduo网络库
文章平均质量分 74
amoscykl
Casablanca!
展开
-
muduo C++ 网络库——封装MutexLock、MutexLockGuard、Condition
MutexLock,MutexLockGuard,Condition这几个class都不允许拷贝构造和赋值。class MutexLock : boost::noncopyable{ public: MutexLock() : holder_(0) { pthread_mutex_init(&mutex_,NULL); } ~MutexLock(...原创 2018-06-20 18:17:35 · 797 阅读 · 0 评论 -
muduo网络库——实现Boost.Asio聊天服务器:完整代码+注释
聊天服务一个服务端进程可以同时服务多个客户端,客户端接受键盘输入,以回车为界把消息发送给服务端,服务端收到消息之后,依次发送给每个连接到它的客户端,原来发送消息的客户端进程也会收到这条消息。 消息格式每条消息有一个4字节头部,以网络序存放字节序长度。比如两条消息“hello”和“chenshuo": 打包的代码把string message打包为muduo::net...原创 2018-10-22 23:33:32 · 2155 阅读 · 0 评论 -
muduo网络库——Buffer类的设计与使用
muduo Buffer设计要点:1.一块连续的内存(char *p, int len)。2.size()可以自动增长,以适应不同大小的消息。3.内部以std::vector<char>来保存数据,并提供相应的访问函数。 Buffer像一个queue,从末尾写入数据,从头部读出数据。TcpConnection会有两个Buffer成员:input buffer, o...原创 2018-10-23 10:46:21 · 994 阅读 · 0 评论 -
muduo网络库——简介:安装、目录结构
6.2安装#安装cmakesudo apt-get install cmake #安装boostsudo apt-get install libboost-dev libboost-test-dev#三个非必须的依赖库:curl、c-ares DNS、Google Protobuf (安装之后cmake会自动多编译一些示例)sudo apt-get install li...原创 2018-10-21 16:40:06 · 2116 阅读 · 1 评论 -
常见的并发网络服务程序设计方案
摘要陈硕老师的“Linux多线程服务端编程 - 使用muduo C ++网络库”12种并发服务器模型,特整理于此,备学习使用。 方案0:接受+读/写一次服务一个客户 这个不是并发服务器。 方案1:接受+ fork()进程每个连接 这个是传统的UNIX并发网络编程方案,也叫过程每次connextion。这种方案适合并发连接数不...原创 2018-10-21 23:59:31 · 677 阅读 · 0 评论 -
muduo源码分析:Channel类 (事件分发器)
事件分发类Channel事件分发器Channel的数据成员如下://定义事件类型变量 static const int kNoneEvent; //无事件 static const int kReadEvent; //可读事件 static const int kWriteEvent; //可写事件...原创 2018-10-31 01:08:30 · 2292 阅读 · 0 评论 -
muduo源码分析:Poller类 (EpollPoller类)
2.I/O复用类PollerPoller类是个基类,它的定义如下:class Poller : boost::noncopyable { public: typedef std::vector<Channel *> ChannelList; Poller(EventLoop *loop); ...原创 2018-10-31 01:19:04 · 530 阅读 · 0 评论 -
muduo源码分析:EventLoop类 (核心)
4.EventLoop类的实现EventLoop类实现了reactor的基本模式 ,它的数据定义如下: void abortNotInLoopThread(); //不在主I/O线程 void handleRead(); // waked up //将事件通知描述符里的内容读走,以便让其继续检测事件通知 void doPendingFunctors(); ...原创 2018-10-31 01:21:28 · 1107 阅读 · 0 评论 -
muduo源码分析:Reactor模式的封装实现
关于muduo实现的Reactor模式,有三个关键的类:1.事件分发器类Channel2.封装I/O复用的Poller (主要研究EpollPoller)3.定时器接口类TimerQueue事件循环EventLoop类实现了Reactor的基本模式。 1.事件分发类Channel事件分发器Channel的数据成员如下://定义事件类型变量 s...原创 2018-10-31 01:24:17 · 612 阅读 · 0 评论 -
muduo源码分析:Thread类
代码文件目录为:muduo/base ThreadNameInitializerThreadNameInitializer进行主线程初始化操作(利用全局变量):包括设置默认的线程name、缓存线程id。如果进行了fork,那么在子进程中运行afterFork函数进行同样的初始化工作。void afterFork(){ muduo::CurrentThread::t_cach...原创 2018-11-01 17:32:58 · 1199 阅读 · 1 评论 -
muduo源码分析:ThreadPool 线程池的实现
源码:https://github.com/chenshuo/muduo/blob/master/muduo/base/ThreadPool.hhttps://github.com/chenshuo/muduo/blob/master/muduo/base/ThreadPool.cc线程池ThreadPool用到了前面分析的Thread、MutexLock、Condition。Th...原创 2018-11-01 18:03:42 · 1032 阅读 · 0 评论 -
muduo源码分析:Acceptor类
Acceptor用于接受(accept)客户端的连接,通过设置回调函数通知使用者。它只在muduo网络库内部的TcpServer使用,由TcpServer控制它的生命期。实际上,Acceptor只是对 Channel 的封装,通过Channel关注listenfd的 readable可读事件 ,并设置好回调函数就可以了。因此理解了上一节的muduo:Reactor,那么Acceptor也比较容...原创 2018-11-01 21:14:40 · 563 阅读 · 0 评论 -
muduo源码分析:TcpServer类
上篇博文学习了Acceptor class 的实现,它仅仅是对Channel和Socket的简单封装,对使用者来说简单易用。这得益于底层架构Reactor。接下来,开始学习muduo对于建立连接的处理。这属于muduo提到的三个半事件中的第一个。可以想一下,TcpServer class应该也是对Acceptor,Poller的封装。 连接处理过程首先TcpServer通过Accepto...原创 2018-11-01 22:24:09 · 604 阅读 · 0 评论 -
muduo网络库——五个简单编程示例
五个简单TCP示例:echo, discard, chargen, daytime, timeecho:回显服务,把收到的数据发回客户端。discard:丢弃所有收到的数据。chargen:服务端accept连接之后,不停地发送测试数据。daytime:服务端accept连接之后,以字符串形式发送当前时间,然后主动断开连接。time:服务端accept连接之后,以二进制形...原创 2018-10-22 09:59:16 · 4798 阅读 · 0 评论 -
muduo网络库的安装、编译和使用
github项目地址https://github.com/chenshuo/muduo 安装:#安装cmakesudo apt-get install cmake #安装boostsudo apt-get install libboost-dev libboost-test-dev#三个非必须的依赖库:curl、c-ares DNS、Google Protobuf...原创 2018-10-19 17:19:38 · 4583 阅读 · 0 评论 -
muduo网络库源码分析——整体架构
muduo的源代码中,虽然不考虑可移植性,但还是划分了很多小的类(Channel、Socket、TcpConnection、Acceptor,不知道是不是参考了java中的概念),类之间大量通过boost::bind()注册回调函数,感觉比继承还要难理解。但是无论如何,muduo所强调的关于现代C++编程技术和多线程服务端编程理念都是非常值得学习的。本文的主要目的:从整体架构上分析muduo的...转载 2018-10-09 22:54:29 · 6725 阅读 · 3 评论 -
muduo C++ 网络库——线程同步精要
并发编程有两种基本模型:message passing 消息传递 和 shared memory 内存共享运行在多台机器上的多个进程的并行编程只有一种实用模型: message passing 线程同步的四项原则:按重要性排列1.首要原则是最低限度地共享对象,减少需要同步的场合。一个对象能不暴露给别的进程就不要暴露。2.其次是使用高级的并发编程构件,如TaskQueue,Producer-Cons...原创 2018-06-20 18:25:14 · 758 阅读 · 0 评论 -
muduo C++ 网络库——线程同步精要(1):互斥锁
互斥器:使用得最多的同步原语互斥锁的详细介绍在这一篇博文中:互斥锁 概念补充:RAII——资源的有效期与持有资源的对象的生命期严格绑定,即由对象的构造函数完成资源的分配(获取),同时由析构函数完成资源的释放。只要对象能正确地析构,就不会出现资源泄漏问题。 互斥器保护了临界区,任何一个时刻最多只能有一个线程在此mutex划出的临界区内活动。单独使用mutex时,主要为了保护共享数据。原则:-用RA...原创 2018-06-20 18:32:14 · 785 阅读 · 0 评论 -
muduo C++ 网络库——线程同步精要(2):条件变量
条件变量条件变量的详细介绍在之前的一篇博文中:Linux线程同步——条件变量互斥器是加锁原语,用来排他性地访问共享数据,使用mutex时,我们希望立即拿到锁,然后尽快访问数据,用完之后尽快解锁,这样才能不影响并发性和性能。先介绍moduo中condition的封装:[cpp] view plain copyclass Condition : boost::noncopyable { p...原创 2018-06-20 18:35:14 · 377 阅读 · 0 评论 -
mutex和lock_guard,muduo网络库的MutexLock 与MutexLockGuard
互斥锁是用来保护一段临界区的,它可以保证某段时间内只有一个线程在执行一段代码或者访问某个资源。 C++11的mutex和lock_guard C++11新增了mutex,使用方法和linux底下的常用使用方法差不多。先使用std::mutex 定义一个互斥锁,例如std::mutex XXXmutex在需要使用互斥锁的时候,使用XXXmutex.lock();上锁,以及使用XXXmutex.unl...原创 2018-06-08 16:33:11 · 912 阅读 · 0 评论 -
条件变量之虚假唤醒 (Spurious wakeup)
虚假唤醒描述了使用某些多线程API(如POSIX线程和Windows API)提供的条件变量的复杂情况。即使在一个条件变量似乎已从等待线程的角度发出信号后,所等待的条件仍可能是错误的。其中一个原因是虚假唤醒; 也就是说,即使没有线程发信号通知条件变量,线程也可能从其等待状态中唤醒。为了正确,有必要在线程完成等待之后验证条件是否为真。由于虚假唤醒可能会重复发生,因此可以通过等待条件为真时终止的循环来...原创 2018-06-20 16:58:50 · 1958 阅读 · 0 评论 -
muduo网络库——C++多线程系统编程精要
4.1 基本线程原语的选用11个最基本的Pthreads函数是:2个:线程的创建和等待结束(join)。封装为muduo::Thread。4个:mutex的创建、销毁、加锁、解锁。封装为muduo::MutexLock。5个:条件变量的创建、销毁、等待、通知、广播。封装为muduo::Condition。 这三样东西(thread、mutex、condition)可以完成...原创 2018-10-18 00:10:56 · 1152 阅读 · 0 评论 -
muduo库整体架构简析
muduo是一个高质量的Reactor网络库,采用one loop per thread + thread pool架构实现,代码简洁,逻辑清晰,是学习网络编程的很好的典范。 muduo的代码分为两部分,base和net,base部分实现一些基础功能,例如log, thread, threadpool, mutex, queue 等,这些基础模块在后面网络库中很多地方都可以复用, bas...转载 2018-10-14 00:20:24 · 1261 阅读 · 0 评论 -
线程池的原理及C++线程池的封装实现
线程池原理介绍线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。线程池的组成部分:线程池管理器(ThreadPoolManager):用于创建并管理线程池 工作线程(WorkThread): 线程池中线程 任务接口(Task):每个任务必须实现的接口...原创 2018-10-08 17:24:04 · 4498 阅读 · 0 评论 -
muduo网路库——高效的多线程日志
在服务端编程中,日志是必不可少的,通常用于故障诊断和追踪,也可用于性能分析。在生产环境中应该做到 "Log Everything All The Time"。 一个日志库大体可分为前端(frontend)和后端(backend)两部分。前端是供应用程序使用的接口(API),并生成日志消息;后端则负责把日志消息写到目的地。在多线程程序中,每个线程有自己的前端,整个程序共用一个后端。对于C...原创 2018-10-18 15:54:49 · 1217 阅读 · 1 评论 -
muduo网络库——详解muduo多线程模型
6.3 非阻塞网络编程应该用边沿触发(ET)还是电平触发(LT)?如果是电平触发,那么什么时候关注POLLOUT事件?会不会造成busy-loop?如果是边沿触发,如果和防止漏读造成的饥饿?epoll一定比poll快么? 6.4 在finger的测试程序中,没有设置onConnection这个函数,就可以连接? 6.6 详解muduo多线程模型 ...原创 2018-10-09 20:55:33 · 1828 阅读 · 0 评论 -
muduo源码分析:TcpConnection类
前言前面学习了TcpServer的实现,TcpServer对每个连接都会新建一个TcpConnection(使用shared_ptr管理)。接下来学习一下TcpConnection的设计细节。 连接状态muduo对于一个连接的从生到死进行了状态的定义,类似一个状态机。enum States { kDisconnected, kConnecting, kConnected, k...原创 2018-11-01 22:50:56 · 742 阅读 · 0 评论