muduo

muduo网络库学习——日志系统

允我心安 提交于 2020-03-03 00:51:41
日志的使用方式: LOG_INFO << "AAA"; LOG_INFO是一个宏,展开后为: muduo::Logger(__FILE__, __LINE__).stream() << "AAA"; 构造了一个匿名对象Logger,在这个对象构造的时候其实已经写入了文件名和行号。 匿名对象调用.stream()函数拿到一个LogStream对象,由这个LogStream对象重载<<将“AAA”写入LogStream的数据成员FixBuffer对象的data_缓冲区内。 匿名对象在这条语句执行完毕以后会被销毁,因此会调用~muduo::Logger()函数将日志消息输出至目的地(标准输出或者磁盘的日志文件); 日志的流程: Logger——Impl——LogStream——operator<<——LogStream的FixBuffer内——g_output——g_flush 高性能日志(异步日志)所在: 由于磁盘IO是移动磁头的方式来记录文件的,其速度与CPU运行速度并不在一个数量级上。因此业务线程中应该避免进行磁盘IO以防止业务得不到及时的处理。 在多线程程序中,业务线程应该专注与其业务逻辑的运算,用另外一个独立的线程来将日志消息写入磁盘。 在muduo的日志系统中,分为前端和后端。前端是业务线程产生一条条的日志消息。后端是日志线程,将日志消息写入文件。 业务线程有多个

以基于Reactor模式的高并发EchoServer为例剖析muduo库框架

£可爱£侵袭症+ 提交于 2020-03-02 17:40:49
前言 在讲解基于muduo库的高并发echo服务器之前,我们先来回顾一下我们一般编写基于Reactor模式的高并发服务器的基本流程。 muduo的EchoServer其实也是基于上述流程,只不过进行了一定程度地封装,本质上仍是Reactor模式。muduo的example中的echo服务器代码展示的是只有一个reactor的服务器,muduo其实支持one loop per thread + 线程池的模式,也即multiple reactors + 业务线程池的模式,也就是服务器同时有多个IO线程,其中Acceptor所在的IO线程成为mainReactor,其他的IO线程成为subReactor,mainReactor主要负责处理监听描述符listenfd的上的时间,也就是负责处理客户端的连接请求。而subReactor主要负责已连接描述符connfd上的事件,也就是在和客户端建立好连接之后负责处理和客户端的具体通信。mainReactor+subReactor是由多个IO线程实现的,在muduo库当中,其通过在IO线程池中设置是让其工作在单IO线程模式还是多IO线程模式。而所谓的业务线程池主要是指计算线程池,其主要负责处理具体的业务逻辑,不涉及具体的IO操作。 在认真阅读完一遍muduo库源码之后,我认为如果想基于muduo库编写一个单线程版的echo服务器

muduo base库学习笔记

柔情痞子 提交于 2020-02-10 00:44:41
谁能想到,这名16岁的少女四年前只是一名年仅12岁的少女 前言 注: 个人水平有限,不能保证此文完全正确,如果错误,请不吝指出。 此文在观看《大并发服务器开发》视频时所做。 因此本文所讲基于muduo库0.9.1-beta版本,需要依赖cmake及boost. (rawmd不依赖boost,依赖c++11) sudo apt-get install cmake libboost-dev libboost-test-dev . 更新时间:<2018-03-12> 原创时间: <2018-03-12> 面向对象编程与基于对象编程 std::boost::function std::bootst::bind muduo::base中类关系及作用 copyable.h 一个空类,用来标识子类是值语义。 Types.h 提供字符串类的声明,及两个类型转换函数模板。 implicit_cast (隐式转换),使代码阅读时更明晰。 down_cast (向下转型),基类指针转换为派生类指针,前提是基类指针指向派生类对象。 Timestamp.h/cc 提供封装好的时间类。 继承copyable,值语义。 继承boot::less_than_comparable ,less_than_comparable:要求提供<,可自动实现>,<=,>= BOOST_STATIC_ASSERT(sizeof

muduo base库学习笔记

穿精又带淫゛_ 提交于 2020-02-09 22:22:23
谁能想到,这名16岁的少女四年前只是一名年仅12岁的少女 前言 注: 个人水平有限,不能保证此文完全正确,如果错误,请不吝指出。 此文在观看《大并发服务器开发》视频时所做。 因此本文所讲基于muduo库0.9.1-beta版本,需要依赖cmake及boost. (rawmd不依赖boost,依赖c++11) sudo apt-get install cmake libboost-dev libboost-test-dev . 更新时间:<2018-03-12> 原创时间: <2018-03-12> 面向对象编程与基于对象编程 std::boost::function std::bootst::bind muduo::base中类关系及作用 copyable.h 一个空类,用来标识子类是值语义。 Types.h 提供字符串类的声明,及两个类型转换函数模板。 implicit_cast (隐式转换),使代码阅读时更明晰。 down_cast (向下转型),基类指针转换为派生类指针,前提是基类指针指向派生类对象。 Timestamp.h/cc 提供封装好的时间类。 继承copyable,值语义。 继承boot::less_than_comparable ,less_than_comparable:要求提供<,可自动实现>,<=,>= BOOST_STATIC_ASSERT(sizeof

muduo库学习笔记十三:base库之ThreadLocalSingleton

扶醉桌前 提交于 2020-02-06 11:48:43
线程本地存储单例类 : 针对“每个结构”每个线程仅有一个线程本地存储类对象 t_value_:类型为T的指针是pod类型可以用__thread修饰,每个线程一份 deleter:Deleter类对象 instance():返回T引用 pointer():返回T指针 destructor():借助Deleter才能被调用 Deleter类:嵌套在ThreadLocalSingleton类中,借助于TSD实现线程本地存储机制 Show Me The Code : // Use of this source code is governed by a BSD-style license // that can be found in the License file. // // Author: Shuo Chen (chenshuo at chenshuo dot com) #ifndef MUDUO_BASE_THREADLOCALSINGLETON_H #define MUDUO_BASE_THREADLOCALSINGLETON_H #include <boost/noncopyable.hpp> #include <assert.h> #include <pthread.h> namespace muduo { template<typename T> class

muduo库学习笔记十一:base库之Singleton

时光总嘲笑我的痴心妄想 提交于 2020-02-06 03:14:32
模板单例类 :线程安全的单例模式实现 // Use of this source code is governed by a BSD-style license // that can be found in the License file. // // Author: Shuo Chen (chenshuo at chenshuo dot com) #ifndef MUDUO_BASE_SINGLETON_H #define MUDUO_BASE_SINGLETON_H #include <boost/noncopyable.hpp> #include <pthread.h> #include <stdlib.h> // atexit namespace muduo { template<typename T> class Singleton : boost::noncopyable//不可以拷贝 { public: static T& instance() { pthread_once(&ponce_, &Singleton::init);//该函数保证只被调用一次,并且保证线程安全 return *value_; } private: Singleton(); ~Singleton(); static void init() { value_ = new T(); :

build muduo库时报错

自作多情 提交于 2020-01-24 07:16:41
报错为 undefined reference to boost::unit_test::ut_detail::auto_test_unit_registrar::auto_test_unit_registrar… 对‘boost::unit_test::ut_detail::normalize_test_case_name(boost::unit_test::basic_cstring)’未定义的引用 网上查了很多资料,说是gcc不同版本的ABI不兼容。陈硕自己也回复了这个问题 ubuntu gcc 。但是我尝试了,没有能够解决。我是单独编译和安装的Boost库,在CSDN上看到的教程。但是实际上,并不需要。 最后的解决办法,先卸载boost库和删除Muduo源代码。重新在Github上下载了muduo源代码的zip,解压。打开终端,输入 $sudo apt-get install libboost-dev libboost-test-dev 然后 $cd /muduo ,输入 $./build.sh 最后$./build.sh install 来源: CSDN 作者: TUR1997 链接: https://blog.csdn.net/qq_43325061/article/details/103939599

【linux】centos7下muduo库的安装

拈花ヽ惹草 提交于 2020-01-16 10:11:09
特别提醒:建议在普通用户模式下安装muduo库 普通用户模式下的centos7,安装muduo库需要给普通用户授权。授权方法采纳如下博客: https://www.cnblogs.com/mrcln/p/6117267.html 授权好之后,进行下面的步骤: 一、github下载muduo源码, https://github.com/chenshuo/muduo 下载完成之后我用xshell上传到我的普通用户的 下载 这个文件夹里面,xchell将windows下的压缩包上传到Linux里面的方法请自行百度。 二、安装cmake 确保系统安装gcc,ncurses-devel(注意gcc的版本要支持c++11,centos的默认版本不支持) yum -y install gcc-c++ yum -y install ncurses-devel cmake地址: https://cmake.org/files/v3.6/cmake-3.6.2.tar.gz 来源: CSDN 作者: 机械吴哥123 链接: https://blog.csdn.net/weixin_41498246/article/details/103996962

学习muduo库(13)之evenloop类中wakeup()的概念

六眼飞鱼酱① 提交于 2020-01-12 01:41:53
预备知识: eventfd eventfd是Linux 2.6提供的一种系统调用,它可以用来实现事件通知。eventfd包含一个由内核维护的64位无符号整型计数器,创建eventfd时会返回一个文件描述符,进程可以通过对这个文件描述符进行read/write来读取/改变计数器的值,从而实现进程间通信。 #include <sys/eventfd.h> int eventfd(unsigned int initval, int flags); flags 可以是以下值的 OR 运算结果,用以改变 eventfd 的行为。 EFD_CLOEXEC (since Linux 2.6.27) 文件被设置成 O_CLOEXEC,创建子进程 (fork) 时不继承父进程的文件描述符。 EFD_NONBLOCK (since Linux 2.6.27) 文件被设置成 O_NONBLOCK,执行 read / write 操作时,不会阻塞。 EFD_SEMAPHORE (since Linux 2.6.30) 提供类似信号量语义的 read 操作,简单说就是计数值 count 递减 1。 在 Linux 2.6.26 版本之前,没有使用参数 flags,必须指定为 0。muduo库中设置为0 操作方法 一切皆为文件是 Linux 内核设计的一种高度抽象,eventfd 的实现也不例外

muduo网络库编译安装

馋奶兔 提交于 2020-01-11 15:36:42
1 下载地址 https://share.weiyun.com/5h0iIOX 2 安装依赖 $ sudo apt-get install cmake $ sudo apt-get install libboost-dev $ tar zxf muduo-0.9.1-beta.tar.gz $ cd muduo/ $./build.sh centos系统使用yum install boost-devel来安装libboost-dev库。 3 编译完的目录 编译完回在muduo同级目录下创建一个build目录, 该目录下debug目录下是主要的文件。 debug/bin目录是测试程序, 比如,inspector_test是一个返回服务信息的一个服务。 debug/lib目录是生成的静态库。 4 安装 在刚才muduo工程下执行 #./build.sh install 则会创建一个目录build/debug-install, 里面有库的头文件和库文件。 [root@localhost debug-install]# ll total 8 drwxr-xr-x. 3 root root 4096 Mar 24 13:27 include drwxr-xr-x. 2 root root 4096 Mar 24 13:27 lib [root@localhost debug-install]