Linux多執行緒服務端編程:使用muduoC++網路庫

Linux多執行緒服務端編程:使用muduoC++網路庫

《Linux多執行緒服務端編程:使用muduoC++網路庫》是2013年1月電子工業出版社出版的圖書,作者是陳碩。

基本介紹

  • 書名:Linux多執行緒服務端編程:使用muduoC++網路庫
  • 作者:陳碩
  • ISBN:9787121192821
  • 出版社:電子工業出版社
  • 出版時間:2013年1月
  • 頁數:616
  • 字數:801千字
  • 開本:16(185*230)
  • 版次:01-01
內容簡介,圖書目錄,作者簡介,

內容簡介

本書主要講述採用現代 C++ 在 x86-64 Linux 上編寫多執行緒 TCP 網路服務程式的主流常規技術,重點講解一種適應性較強的多執行緒伺服器的編程模型,即 one loop per thread。這是在 Linux 下以 native 語言編寫用戶態高性能網路程式最成熟的模式,掌握之後可順利地開發各類常見的服務端網路應用程式。本書以 muduo 網路庫為例,講解這種編程模型的使用方法及注意事項。 本書的宗旨是貴精不貴多。掌握兩種基本的同步原語就可以滿足各種多執行緒同步的功能需求,還能寫出更易用的同步設施。掌握一種進程間通信方式和一種多執行緒網路編程模型就足以應對日常開發任務,編寫運行於公司區域網路環境的分散式服務系統。

圖書目錄

目 錄
第 1 部分 C++ 多執行緒系統編程
第 1 章 執行緒安全的對象生命期管理
1.1 當析構函式遇到多執行緒
1.1.1 執行緒安全的定義
1.1.2 MutexLock 與 MutexLockGuard
1.1.3 一個執行緒安全的 Counter 示例
1.2 對象的創建很簡單
1.3 銷毀太難
1.3.1 mutex 不是辦法
1.3.2 作為數據成員的 mutex 不能保護析構
1.4 執行緒安全的 Observer 有多難
1.5 原始指針有何不妥
1.6 神器 shared_ptr/weak_ptr
1.7 插曲:系統地避免各種指針錯誤
1.8 套用到 Observer 上
1.9 再論 shared_ptr 的執行緒安全
1.10 shared_ptr 技術與陷阱
1.11 對象池
1.11.1 enable_shared_from_this
1.11.2 弱回調
1.12 替代方案
1.13 心得與小結
1.14 Observer 之謬
第 2 章 執行緒同步精要
2.1 互斥器(mutex)
2.1.1 只使用非遞歸的 mutex
2.1.2 死鎖
2.2 條件變數(condition variable)
2.3 不要用讀寫鎖和信號量
2.4 封裝 MutexLock、MutexLockGuard、Condition
2.5 執行緒安全的 Singleton 實現
2.6 sleep(3) 不是同步原語
2.7 歸納與總結
2.8 借 shared_ptr 實現 copy-on-write
第 3 章 多執行緒伺服器的適用場合與常用編程模型
3.1 進程與執行緒
3.2 單執行緒伺服器的常用編程模型
3.3 多執行緒伺服器的常用編程模型
3.3.1 one loop per thread
3.3.2 執行緒池
3.3.3 推薦模式
3.4 進程間通信只用 TCP
3.5 多執行緒伺服器的適用場合
3.5.1 必須用單執行緒的場合
3.5.2 單執行緒程式的優缺點
3.5.3 適用多執行緒程式的場景
3.6 “多執行緒伺服器的適用場合”例釋與答疑
第 4 章 C++ 多執行緒系統編程精要
4.1 基本執行緒原語的選用
4.2 C/C++ 系統庫的執行緒安全性
4.3 Linux 上的執行緒標識
4.4 執行緒的創建與銷毀的守則
4.4.1 pthread_cancel 與 C++
4.4.2 exit(3) 在 C++ 中不是執行緒安全的
4.5 善用 __thread 關鍵字
4.6 多執行緒與 IO
4.7 用 RAII 包裝檔案描述符
4.8 RAII 與 fork()
4.9 多執行緒與 fork()
4.10 多執行緒與 signal
4.11 Linux 新增系統調用的啟示
第 5 章 高效的多執行緒日誌
5.1 功能需求
5.2 性能需求
5.3 多執行緒異步日誌
5.4 其他方案
第 2 部分 muduo 網路庫
第 6 章 muduo 網路庫簡介
6.1 由來
6.2 安裝
6.3 目錄結構
6.3.1 代碼結構
6.3.2 例子
6.3.3 執行緒模型
6.4 使用教程
6.4.1 TCP 網路編程本質論
6.4.2 echo 服務的實現
6.4.3 七步實現 finger 服務
6.5 性能評測
6.5.1 muduo 與 Boost.Asio、libevent2 的吞吐量對比
6.5.2 擊鼓傳花:對比 muduo 與 libevent2 的事件處理效率
6.5.3 muduo 與 Nginx 的吞吐量對比
6.5.4 muduo 與 ZeroMQ 的延遲對比
6.6 詳解 muduo 多執行緒模型
6.6.1 數獨求解伺服器
6.6.2 常見的並發網路服務程式設計方案
第 7 章 muduo 編程示例
7.1 五個簡單 TCP 示例
7.2 檔案傳輸
7.3 Boost.Asio 的聊天伺服器
7.3.1 TCP 分包
7.3.2 訊息格式
7.3.3 編解碼器 LengthHeaderCodec
7.3.4 服務端的實現
7.3.5 客戶端的實現
7.4 muduo Buffer 類的設計與使用
7.4.1 muduo 的 IO 模型
7.4.2 為什麼 non-blocking 網路編程中套用層 buffer 是必需的
7.4.3 Buffer 的功能需求
7.4.4 Buffer 的數據結構
7.4.5 Buffer 的操作
7.4.6 其他設計方案
7.4.7 性能是不是問題
7.5 一種自動反射訊息類型的 Google Protobuf 網路傳輸方案
7.5.1 網路編程中使用 Protobuf 的兩個先決條件
7.5.2 根據 type name 反射自動創建 Message 對象
7.5.3 Protobuf 傳輸格式
7.6 在 muduo 中實現 Protobuf 編解碼器與訊息分發器
7.6.1 什麼是編解碼器(codec)
7.6.2 實現 ProtobufCodec
7.6.3 訊息分發器(dispatcher)有什麼用
7.6.4 ProtobufCodec 與 ProtobufDispatcher 的綜合運用
7.6.5 ProtobufDispatcher 的兩種實現
7.6.6 ProtobufCodec 和 ProtobufDispatcher 有何意義
7.7 限制伺服器的最大並發連線數
7.7.1 為什麼要限制並發連線數
7.7.2 在 muduo 中限制並發連線數
7.8 定時器
7.8.1 程式中的時間
7.8.2 Linux 時間函式
7.8.3 muduo 的定時器接口
7.8.4 Boost.Asio Timer 示例
7.8.5 Java Netty 示例
7.9 測量兩台機器的網路延遲和時間差
7.10 用 timing wheel 踢掉空閒連線
7.10.1 timing wheel 原理
7.10.2 代碼實現與改進
7.11 簡單的訊息廣播服務
7.12 “串並轉換”連線伺服器及其自動化測試
7.13 socks4a 代理伺服器
7.13.1 TCP 中繼器
7.13.2 socks4a 代理伺服器
7.13.3 N : 1 與 1 : N 連線轉發
7.14 短址服務
7.15 與其他庫集成
7.15.1 UDNS
7.15.2 c-ares DNS
7.15.3 curl
7.15.4 更多
第 8 章 muduo 網路庫設計與實現
8.0 什麼都不做的 EventLoop
8.1 Reactor 的關鍵結構
8.1.1 Channel class
8.1.2 Poller class
8.1.3 EventLoop 的改動
8.2 TimerQueue 定時器
8.2.1 TimerQueue class
8.2.2 EventLoop 的改動
8.3 EventLoop::runInLoop() 函式
8.3.1 提高 TimerQueue 的執行緒安全性
8.3.2 EventLoopThread class
8.4 實現 TCP 網路庫
8.5 TcpServer 接受新連線
8.5.1 TcpServer class
8.5.2 TcpConnection class
8.6 TcpConnection 下線
8.7 Buffer 讀取數據
8.7.1 TcpConnection 使用 Buffer 作為輸入緩衝
8.7.2 Buffer::readFd()
8.8 TcpConnection 傳送數據
8.9 完善 TcpConnection
8.9.1 SIGPIPE
8.9.2 TCP No Delay 和 TCP keepalive
8.9.3 WriteCompleteCallback 和 HighWaterMarkCallback
8.10 多執行緒 TcpServer
8.11 Connector
8.12 TcpClient
8.13 epoll
8.14 測試程式一覽
第 3 部分 工程實踐經驗談
第 9 章 分散式系統工程實踐
9.1 我們在技術浪潮中的位置
9.1.1 分散式系統的本質困難
9.1.2 分散式系統是個險惡的問題
9.2 分散式系統的可靠性淺說
9.2.1 分散式系統的軟體不要求 7 × 24 可靠
9.2.2 “能隨時重啟進程”作為程式設計目標
9.3 分散式系統中心跳協定的設計
9.4 分散式系統中的進程標識
9.4.1 錯誤做法
9.4.2 正確做法
9.4.3 TCP 協定的啟示
9.5 構建易於維護的分散式程式
9.6 為系統演化做準備
9.6.1 可擴展的訊息格式
9.6.2 反面教材:ICE 的訊息打包格式
9.7 分散式程式的自動化回歸測試
9.7.1 單元測試的能與不能
9.7.2 分散式系統測試的要點
9.7.3 分散式系統的抽象觀點
9.7.4 一種自動化的回歸測試方案
9.7.5 其他用處
9.8 分散式系統部署、監控與進程管理的幾重境界
9.8.1 境界 1:全手工操作
9.8.2 境界 2:使用零散的自動化腳本和第三方組件
9.8.3 境界 3:自製機群管理系統,集中化配置
9.8.4 境界 4:機群管理與 naming service 結合
第 10 章 C++ 編譯連結模型精要
10.1 C 語言的編譯模型及其成因
10.1.1 為什麼 C 語言需要預處理
10.1.2 C 語言的編譯模型
10.2 C++ 的編譯模型
10.2.1 單遍編譯
10.2.2 前向聲明
10.3 C++ 連結(linking)
10.3.1 函式重載
10.3.2 inline 函式
10.3.3 模板
10.3.4 虛函式
10.4 工程項目中頭檔案的使用規則
10.4.1 頭檔案的害處
10.4.2 頭檔案的使用規則
10.5 工程項目中庫檔案的組織原則
10.5.1 動態庫是有害的
10.5.2 靜態庫也好不到哪兒去
10.5.3 源碼編譯是王道
第 11 章 反思 C++ 面向對象與虛函式
11.1 樸實的 C++ 設計
11.2 程式庫的二進制兼容性
11.2.1 什麼是二進制兼容性
11.2.2 有哪些情況會破壞庫的 ABI
11.2.3 哪些做法多半是安全的
11.2.4 反面教材:COM
11.2.5 解決辦法
11.3 避免使用虛函式作為庫的接口
11.3.1 C++ 程式庫的作者的生存環境
11.3.2 虛函式作為庫的接口的兩大用途
11.3.3 虛函式作為接口的弊端
11.3.4 假如 Linux 系統調用以 COM 接口方式實現
11.3.5 Java 是如何應對的
11.4 動態庫接口的推薦做法
11.5 以 boost::function 和 boost::bind 取代虛函式
11.5.1 基本用途
11.5.2 對程式庫的影響
11.5.3 對面向對象程式設計的影響
11.6 iostream 的用途與局限
11.6.1 stdio 格式化輸入輸出的缺點
11.6.2 iostream 的設計初衷
11.6.3 iostream 與標準庫其他組件的互動
11.6.4 iostream 在使用方面的缺點
11.6.5 iostream 在設計方面的缺點
11.6.6 一個 300 行的 memory buffer output stream
11.6.7 現實的 C++ 程式如何做檔案 IO
11.7 值語義與數據抽象
11.7.1 什麼是值語義
11.7.2 值語義與生命期
11.7.3 值語義與標準庫
11.7.4 值語義與 C++ 語言
11.7.5 什麼是數據抽象
11.7.6 數據抽象所需的語言設施
11.7.7 數據抽象的例子
第 12 章 C++ 經驗談
12.1 用異或來交換變數是錯誤的
12.1.1 編譯器會分別生成什麼代碼
12.1.2 為什麼短的代碼不一定快
12.2 不要重載全局 ::operator new()
12.2.1 記憶體管理的基本要求
12.2.2 重載 ::operator new() 的理由
12.2.3 ::operator new() 的兩種重載方式
12.2.4 現實的開發環境
12.2.5 重載 ::operator new() 的困境
12.2.6 解決辦法:替換 malloc()
12.2.7 為單獨的 class 重載 ::operator new() 有問題嗎
12.2.8 有必要自行定製記憶體分配器嗎
12.3 帶符號整數的除法與餘數
12.3.1 語言標準怎么說
12.3.2 C/C++ 編譯器的表現
12.3.3 其他語言的規定
12.3.4 腳本語言解釋器代碼
12.3.5 硬體實現
12.4 在單元測試中 mock 系統調用
12.4.1 系統函式的依賴注入
12.4.2 連結期墊片(link seam)
12.5 慎用匿名 namespace
12.5.1 C 語言的 static 關鍵字的兩種用法
12.5.2 C++ 語言的 static 關鍵字的四種用法
12.5.3 匿名 namespace 的不利之處
12.5.4 替代辦法
12.6 採用有利於版本管理的代碼格式
12.6.1 對 diff 友好的代碼格式
12.6.2 對 grep 友好的代碼風格
12.6.3 一切為了效率
12.7 再探 std::string
12.7.1 直接拷貝(eager copy)
12.7.2 寫時複製(copy-on-write)
12.7.3 短字元串最佳化(SSO)
12.8 用 STL algorithm 輕鬆解決幾道算法面試題
12.8.1 用 next_permutation() 生成排列與組合
12.8.2 用 unique() 去除連續重複空白
12.8.3 用 {make,push,pop}_heap() 實現多路歸併
12.8.4 用 partition() 實現“重排數組,讓奇數位於偶數前面”
12.8.5 用 lower_bound() 查找 IP 地址所屬的城市
第 4 部分 附錄
附錄 A 談一談網路編程學習經驗
附錄 B 從《C++ Primer(第 4 版)》入手學習 C++
附錄 C 關於 Boost 的看法
附錄 D 關於 TCP 並發連線的幾個思考題與試驗
參考文獻

作者簡介

陳碩,北京師範大學碩士,擅長 C++ 多執行緒網路編程和實時分散式系統架構。曾在摩根史坦利 IT 部門工作 5 年,從事實時外匯交易系統開發。現在在美國加州矽谷某網際網路大公司工作,從事大規模分散式系統的可靠性工程。編寫了開源 C++ 網路庫 muduo,參與翻譯了《代碼大全(第 2 版) 》和《C++ 編程規範(繁體版) 》 ,整理了《C++ Primer (第 4 版) (評註版) 》 ,並曾多次在各地技術大會演講。

相關詞條

熱門詞條

聯絡我們