源码 CountDownLatch.h #pragma once #include "Mutex.h" #include "Condition.h" #include "NonCopyable.h" namespace muduo { class CountDownLatch : public NonCopyable { public: explicit CountDownLatch(int count)
源码 Date.h #include "Copyable.h" #include <time.h> #include <string> namespace muduo { class Date : public Copyable { public: struct YearMonthDay { int year; //@ [1900 2500] int mo
源码 #pragma once #include <pthread.h> #include "NonCopyable.h" #include "CurrentThread.h" namespace muduo { //@ 检查返回值的宏 #ifdef CHECK_PTHREAD_RETURN_VALUE #ifdef NDEBUG __BEGIN_DECLS extern void __assert_perror_fail(int
源码 Exception.h #pragmae once #include <exception> #include <string> namespace muduo { class Exception : public std::exception { public: explicit Exception(std::string msg); ~Exception() noexcept override = default
__thread 线程局部存储 Thread Local Storage(tls),是一种机制,通过这一机制分配的变量,每个当前线程有一个该变量的实例。 在用户层,用一个新的存储类型关键字:__thread 表示这一扩展。 __thread 使用规则: 如果一个线程局部存储变量有一个初始化器,它必须是常量表达式。 __thread 限定
首先是添加注释的源码: // 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_ATOMIC_H #define MUDUO_BASE_ATOMIC_H #include "muduo/ba
在学习muduo_base库中的日志类时,发现了一种新鲜的语法。 1.在类的public中typedef定义的新类型,可以在类外使用类名::新类型名的方式调用。 class Test { public: typedef int integer; ... }; 如果该语句放在public段中,则可以在类外部使用,如: Test::integer a=1;//声明一
echo 服务器测试 调试文件task.json /* muduo网络库给用户提供了两个主要的类 TCPServer:用于编写服务器程序 TCPClient:用于编写客户端程序 epoll+线程池 好处:能够把网络I/O的代码和业务代码区分开,主要开发业务,网络库代码封装了 业务代码暴漏
概览 最近看到陈硕老师的muduo的7.6实现protobuf编解码器与消息分发器,觉得消息分发器这里写的确实很妙,简述一下背景,做业务的时候我们常会在tcp上制定一个消息格式,通过这些消息进行通讯,消息除了长度,类型,消息体为了最大压缩会使用pb,然后陈老师制作一个如下的消息格式样例 +-+-+-+-+-
tcpserver: 说明: 之前说的acceptor负责接收连接,tcpconnection负责对这个连接进行操作。 那么这两个合起来就有一个tcpserver的基本架构了 tcpserver使用acceptor来接受一个连接,使用tcpconnection来对这个连接进行处理。 tcpserver.h /* TcpServer实现了对于TCP服务的封装,功能是管
blockingqueue和boundedblockingqueue 作用: 无边界blockingqueue: 实现了一个有锁的dequeue双端队列保证put,take,size操作都具有原子性内部使用互斥锁mutexlock,再使用一个条件变量用于判断队列是否为空 有边界boundedblockingqueue: 实现了一个有边界的双端队列,实现线程安全,对常
logfile类: class logfile:noncopyable { }; 作用: 主要负责日志写入文件的管理内部提供append,rollFile,flush三个函数append表示向文件尾部追加数据,rollFile表示需要更换一个日志文件来写日志flush表示清空文件读写缓冲区 注意append和flush都提供了有锁/无锁的实现,logfile构
FixedBuffer和logstream class FixedBuffer:noncopyable { }; class logstream:noncopyable { }; 先说一下包含的头文件有一个StringPiece.h 个人感觉这个stringpiece没有必要实现啊,直接用std::string就好了内部实现的操作,基本上std::string都能完成.后面有关stringpiece我都直
简介 Poller class 是IO multiplexing的封装。在muduo中它是一个抽象类,因为muduo同时支持poll和epoll两种IO multiplexing机制。Poller是EventLoop的间接成员,只供其owner EventLoop在IO线程中调用,因此无需加锁。其生命周期和EvenLoop相等。Poller并不拥有Chan
muduo网络库学习--封装reactor模型EventLoop 自己是做驱动的,并不是后端工程师,因此学习Muduo过程中,有很重要的一个坎要迈过去。就是面向对象的封装。muduo很少用到类的继承,这给学习者或者维护者提供了很大的便利,无论是学习和维护,都变得可控,同时又降低了门槛。 本文分享了自己
线程本地存储单例类:针对“每个结构”每个线程仅有一个线程本地存储类对象 t_value_:类型为T的指针是pod类型可以用__thread修饰,每个线程一份 deleter:Deleter类对象 instance():返回T引用 pointer():返回T指针 destructor():借助Deleter才能被调用 Deleter类:嵌套在ThreadLoca
报错为 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不同版本
1. 说明 muduo的日志相关类 又是一个复杂的文件 日志类之间的关系:Logger --> Impl --> LogStream --> operator<<FixedBuffer --> g_output --> g_flush 2. FixedBuffer类 0. 类说明 data_指针指向数组头不变,cur_可变,相当于偏移 end()就返回缓冲区的尾部指针
1. 说明 muduo的日志类,关于日志的相关信息见最后 这个文件有点复杂,而且日志功能贯穿好几个文件,下面开始慢慢探索 日志类之间的关系:Logger --> Impl --> LogStream --> operator<<FixedBuffer --> g_output --> g_flush 2. Logger类 1. 成员变量 LogLevel,枚举
1. 说明 muduo的日志文件类 2. ReadSmallFile类 1. 变量 fd_ 绑定的文件描述符 err_ 错误码吧 buf_ char数组 kBufferSize buf_数组的大小 2. 函数 构造函数 打开文件 析构函数 关闭文件描述符 readToString() 貌似把文件中的内容读成string,放在
1. 类说明 1. 功能 muduo的文件日志类 这里用到了FileUtil和ProcessInfo 2. 继承 noncopyable 2. 成员变量说明 basename_ string类型的文件名 rollSize_ 日志文件达到rollSize_就换一个新文件 flushInterval_ 日志写入间隔时间 checkEveryN_ 看count_的说
1. 说明 还有一些其他的比较简单文件,这里统一说一下 2. ProcessInfo.{h&cc} 这个是关于进程相关的一些操作,不是类,是个命名空间,能获得pid,主机名等 3. Data.{h&cc} 对日期的封装 4. TimeZone.{h&cc} 对UTC和本地时间的封装 5. AsyncLogging.{h&cc} 异步日志,这
原文链接:http://www.cnblogs.com/vinke2013/p/7613075.html 线程安全,支持多核多线程 不支持UDP,只支持TCP 只支持一种是使用模式:non-blocking IO+one event loop per thread + thread pool 只做library,不做framework 不是使用面向对
https://blog.csdn.net/voidccc/article/details/8719752 ========== https://blog.csdn.net/liangzhao_jay/article/details/79656237 ====== https://blog.csdn.net/Ki8Qzvka6Gz4n450m/article/details/79119665 ========== https://blog.csdn.net/kobejayandy/article/deta
文章目录编译运行总结 这里是实现的代码 https://download.csdn.net/download/qq_43390943/11184422 文件 编译 运行 总结 /* * 主要的设计思路: * 1、首先要熟悉reactor的整个设计的模式,主线程负责链接新的客户端,在线程池中获取一个EventLoop来监听这个新产生的文件描