【Muduo库】【base】基本类
一、Timestamp类
1、类图如下:

2、 知识点
(1) 这个类继承了 muduo::copyable, 以及 boost::less_than_comparable.
(2) boost::less_than_comparable 这个类要求实现 <, 可以自动实现 >, <=, >= (自动推导出来的,模板元的思想)
3、 学习流程
(1) 剥离代码 (在 ~/muduo_practice 下), 编译出来一个只有TimeStamp的base库
(2) 小的测试程序在 ~/muduo_practice/tests 下
a. Bsa.cc 测试boost编译时断言的 -> BOOST_STATIC_ASSERT
#include <boost/static_assert.hpp> class Timestamp
{
private:
int64_t microseconds;
}; BOOST_STATIC_ASSERT(sizeof(Timestamp) == sizeof(int64_t));
//BOOST_STATIC_ASSERT(sizeof(short) == sizeof(int64_t));
int main() {
return ;
}
bsa.cc
b. 测试PRId64
#include <cstdio>
#include <ctime>
#define _STDC_FORMAT_MACROS
#include <inttypes.h>
#undef _STDC_FORMAT_MACROS int main(void) {
int64_t value = time(NULL);
printf("%"PRId64"\n", value);
return ;
}
prid.cc
c. 设计一个合理的对TimeStamp类的benchmark
用一个vector数组存储Timestamp, 用Timestamp的微秒表示计算相邻两个时间戳的时间差。Vector需要提前reserve空间,避免内存开销影响benchmark。
代码见Timestamp_sara.cc
//2017-10-29
//Add by wyzhang
//Learn Muduo -- test Timestamp #include <muduo/base/Timestamp.h>
#include <cstdio>
#include <vector>
#define _STDC_FROMAT_MACROS
#include <inttypes.h>
#undef _STDC_FORMAT_MACROS using namespace muduo; // design a benchmark function to test class Timestamp
// we can use a vector to record Timestamp, and calculate difference of neighbors
void benchmark() {
const int kNumbers = * ;
std::vector<Timestamp> vecTimestamp;
vecTimestamp.reserve(kNumbers); //must preReserve. in case calculate the time of allocate mem
for (int i = ; i < kNumbers ; ++i ) {
vecTimestamp.push_back(Timestamp::now());
} int gap[] = {};
Timestamp start = vecTimestamp.front();
for (int i = ; i < kNumbers; ++i ) {
Timestamp next = vecTimestamp[i];
int64_t calGap = next.microSecondsSinceEpoch() - start.microSecondsSinceEpoch(); // use microSeconds here
start = next;
if(calGap < ) {
printf("calGap < 0\n");
} else if (calGap < ){
gap[calGap]++;
} else {
printf("bigGap. [%"PRId64"]\n", calGap);
}
}
for (int i = ; i < ; ++i) {
printf("%d: %d\n", i, gap[i]);
}
} int main() {
//[1] test print timestamp
Timestamp ts(Timestamp::now());
printf("print now = %s\n", ts.toString().c_str());
sleep();
Timestamp ts2 = Timestamp::now();
printf("ts2 = %s\n", ts2.toString().c_str());
double difftime = timeDifference(ts2, ts);
printf("difftime: %f\n", difftime);
//[2] run benchmark
benchmark();
return ;
}
timestamp_sara.cc
执行结果截图如下:没有截全

二、Exception类
1、类图如下:

2、 知识点
(1) 系统调用:backtrace, 栈回溯,保存各个栈帧的地址
(2) 系统调用:backtrace_symbols, 根据地址,转成相应的函数符号
(3) abi::_cxa_demangle
(4) 抛出了异常,如果不catch,会core
3、 学习流程
(1) 测试程序如下
#include <cstdio>
#include <muduo/base/Exception.h> class Bar
{
public:
void test() {
throw muduo::Exception("omg oops");
}
}; void foo() {
Bar b;
b.test();
} int main() {
/* 只抛出异常,不捕获,会core */
//foo();
try {
foo();
}
catch (muduo::Exception& ex) {
printf("%s\n", ex.what());
printf("\n");
printf("%s\n", ex.stackTrace());
}
return ;
}
Exception_sara.cc
运行结果如下

【Muduo库】【base】基本类的更多相关文章
- muduo库的简单使用-echo服务的编写
muduo库的简单使用 muduo是一个基于事件驱动的非阻塞网络库,采用C++和Boost库编写. 它的使用方法很简单,参考这篇文章:TCP网络编程本质论 里面有这么几句: 我认为,TCP 网络编程最 ...
- muduo库整体架构简析
muduo是一个高质量的Reactor网络库,采用one loop per thread + thread loop架构实现,代码简洁,逻辑清晰,是学习网络编程的很好的典范. muduo的代码分为两部 ...
- muduo库安装
一.简介 Muduo(木铎)是基于 Reactor 模式的网络库. 二.安装 从github库下载源码安装:https://github.com/chenshuo/muduo muduo依赖了很多的库 ...
- Debian8 下面 muduo库编译与使用
其实<Linux 多线程服务端编程>已经写得很详细 但是考虑到代码版本的更新和操作系统的不同 可能部分位置会有些许出入 这里做个记录 方便以后学习运行 我使用的虚拟 安装的是debian系 ...
- muduo库源码剖析(一) reactor模式
一. Reactor模式简介 Reactor释义“反应堆”,是一种事件驱动机制.和普通函数调用的不同之处在于:应用程序不是主动的调用某个API完成处理,而是恰恰相反,Reactor逆置了事件处理流程, ...
- muduo库源码剖析(二) 服务端
一. TcpServer类: 管理所有的TCP客户连接,TcpServer供用户直接使用,生命期由用户直接控制.用户只需设置好相应的回调函数(如消息处理messageCallback)然后TcpSer ...
- muduo网络库源码学习————日志滚动
muduo库里面的实现日志滚动有两种条件,一种是日志文件大小达到预设值,另一种是时间到达超过当天.滚动日志类的文件是LogFile.cc ,LogFile.h 代码如下: LogFile.cc #in ...
- muduo网络库源码学习————日志类封装
muduo库里面的日志使方法如下 这里定义了一个宏 #define LOG_INFO if (muduo::Logger::logLevel() <= muduo::Logger::INFO) ...
- muduo网络库源码学习————线程本地单例类封装
muduo库中线程本地单例类封装代码是ThreadLocalSingleton.h 如下所示: //线程本地单例类封装 // Use of this source code is governed b ...
随机推荐
- 二、bootstrap缩略图幅
一.bootstrap缩略图幅
- MongoDB服务的安装与删除
服务的安装: 在MongoDB的目录下创建两个文件夹 data和logs, 在通过cmd进入bin目录下,执行命令: mongod --dbpath "C:\Program Files\Mo ...
- sql对表的操作
--insert into pppcopy select * from ppp //从表ppp中获取数据,并将其插入到pppcopy中,只拷贝表的数据,不拷贝表的结构(前提:表pppcopy1存在) ...
- EL属性范围用法sessionScope等(转)
EL 全名为Expression Language EL 语法很简单,它最大的特点就是使用上很方便.接下来介绍EL主要的语法结构: ${sessionScope.user.sex} 所有EL都是以${ ...
- java 读取html字符串替换字符
import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org. ...
- SCP-bzoj-1090
项目编号:bzoj-1090 项目等级:Safe 项目描述: 戳这里 特殊收容措施: 区间DP.设计状态f[i][j]表示压缩从第i位到第j位的字符串所需的最小长度.转移方式有三种: •初始化:j-i ...
- Hadoop 权限管理(转)
如下图,hadoop访问控制分为两级,其中ServiceLevel Authorization为系统级,用于控制是否可以访问指定的服务,例如用户/组是否可以向集群提交Job,它是最基础的访问控制,优先 ...
- windows环境下安装pymysql(操作带图)
在windows环境下安装pymysql,首先要找到python的安装位置,如果在c盘,启动cmd的时候,要获取管理员权限. 具体步骤,一,管理员模式启动cmd.在箭头指定位置,搜索cmd,出现快捷方 ...
- java中常用的转义字符(转)
Java编程中往往需要一些特殊操作,例如空格,换行.或者一些你使用特殊符号的意愿与程序中特殊符号意思冲突的时候,我们不能直接写就需要把这些符号转义,表达你的本意,并与程序中特殊符号做区分,这些都需要转 ...
- 抓包工具tcpdump用法说明--1
本文目录: 1.1 tcpdump选项 1.2 tcpdump表达式 1.3 tcpdump示例 tcpdump采用命令行方式对接口的数据包进行筛选抓取,其丰富特性表现在灵活的表达式上. 不带任何选项 ...