前言
我是跟着陈硕大神的《Linux多线程服务端编程:使用muduo C++网络库》书学习muduo的。
书看了不到1/3,一直对着书和代码学习,还是有些累的,而且根据我以往的经验,我看书看完后,一般就不去管它了,久而久之,我就忘记了我看过/学过的内容了(我一直都觉得我的记忆力只有7天),因此我打算写写自己至今的读书心得吧
书中抛出了许多多线程编程方面的思考,需要慢慢理解。
muduo中也有许多C++11的编程技巧和编程思想。
解决问题时,要解决的子问题,以及提出的解决方案可能带来的新问题。
要实现一个功能,要考虑设计这个功能时,可能会遇到的问题,该怎么解决呢?为什么这样解决比较好呢?
muduo分为基础库(base)和网络库(net)两大部分
muduo/base下的头文件
这些头文件的文件名也对应了muduo库在base文件夹下实现的功能
├── AsyncLogging.h 异步日志backend:采用可扩充的Buffer块
├── Atomic.h 原子操作与原子整数
├── BlockingQueue.h 无界阻塞队列(生产者消费者队列):用链表实现(猜测)
├── BoundedBlockingQueue.h 有界阻塞队列:用数组实现(猜测)
├── Condition.h 条件变量,需与Mutex.h一同使用:封装系统调用
├── copyable.h 用于标识值类型(可复制)
├── CountDownLatch.h 倒计时门闩
├── CurrentThread.h 当前线程工具函数,实现方式值得学习
├── Date.h Julian日期库(即公历)
├── Exception.h 带stack trace的异常基类
├── FileUtil.h
├── GzipFile.h
├── LogFile.h
├── Logging.h 简单的日志,可搭配AsyncLogging使用
├── LogStream.h
├── Mutex.h 互斥器:封装系统调用
├── noncopyable.h 用于标识对象类型(不可复制)
├── ProcessInfo.h 进程信息
├── Singleton.h 线程安全的singleton
├── StringPiece.h Google开源代码中用于字符串参数传递的类型
├── Thread.h 线程对象:使用pthread_create库调用
├── ThreadLocal.h 线程局部数据
├── ThreadLocalSingleton.h
├── ThreadPool.h 固定大小线程池
├── Timestamp.h UTC时间戳
├── TimeZone.h 时区与夏令时
├── Types.h 基本类型的声明,包括muduo::string
└── WeakCallback.h
muduo/net下的头文件
"##"标记的类为用户不可见的内部类
.
├── Acceptor.h ##接受器,用于服务端接受连接
├── boilerplate.h
├── Buffer.h 缓冲区,非阻塞IO必备
├── Callbacks.h
├── Channel.h 用于每个Socket连接的事件分发
├── Connector.h ##连接器,用于客户端发起连接
├── Endian.h 网络字节序与本机字节序的转换
├── EventLoop.h 事件分发器:一个线程只能有一个
├── EventLoopThread.h 新建一个专门用于EventLoop的线程
├── EventLoopThreadPool.h muduo默认多线程IO模型
├── http 简单的HTTP服务器实现
│ ├── HttpContext.h
│ ├── HttpRequest.h
│ ├── HttpResponse.h
│ ├── HttpServer.h
│ └── tests
├── InetAddress.h IP地址的简单封装
├── inspect 窥探器,用于报告进程状态
│ ├── Inspector.h
│ ├── PerformanceInspector.h
│ ├── ProcessInspector.h
│ ├── SystemInspector.h
│ └── tests
├── poller ##poll(2)和epoll(4)两种IO multiplexing后端
│ ├── EPollPoller.h
│ └── PollPoller.h
├── Poller.h ##IO multiplexing的基类接口
├── protobuf
│ ├── BufferStream.h
│ └── ProtobufCodecLite.h
├── protorpc
│ ├── google-inl.h
│ ├── RpcChannel.h
│ ├── RpcCodec.h
│ └── RpcServer.h
├── Socket.h ##封装Sockets描述符,负责关闭连接
├── SocketsOps.h ##封装底层的Sockets API
├── TcpClient.h TCP客户端
├── TcpConnection.h 封装TCP连接
├── TcpServer.h TCP服务器
├── Timer.h ##定时器
├── TimerId.h 定时器Id:用于唯一标识定时器
├── TimerQueue.h ##定时器队列:按照过期时间排序,越早过期排的越靠前
└── ZlibStream.h