前言
我是跟着陳碩大神的《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