用C++開發頂級多執行緒網路函數庫Muduo
活動訊息
內容簡介
本書專注於簡單容易了解的程式碼,以及最接近C語言的語法,並且大量應用多執行緒的思路,開發出來的非阻塞式(Non-blocking)網路程式庫,比同級產品快了20%,程式碼卻少了50%,充份展現C++的小而美且快。除了C++之外,本書亦充份介紹目前Scale out網路架構的概念,讓你不但可快速學會C++的網路開發,更可了解目前最新的雲端趨勢。
想學好C++就從全球第一個華人開發的頂級C++網路程式庫Muduo開始。本書主要說明採用現代C++ 在x86-64 Linux 上撰寫多執行緒TCP 網路服務程式的主流標準技術,重點說明多執行緒網路服務器的一種IO 模型,即one loopper thread。這是一種適應性強的模型,也是Linux 下以native 語言撰寫使用者態高性能網路程式最成熟的模式,熟練之後可順利地開發各種常見的服務端網路應用程式。本書以muduo 網路函數庫為例,說明這種程式設計模型的使用方法及注意事項。
C++學習時間長,一旦上手,開發出程式碼的超高速度是Java、C#等其它語言無法比較的。
目錄
第1 部分 C++ 多執行緒系統程式設計
Chapter 01 符合執行緒安全的物件生命期管理
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 之謬
Chapter 02 執行緒同步精要
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
Chapter 03 多執行緒伺服器的適用場合與常用程式設計模型
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 「多執行緒伺服器的適用場合」例釋與答疑
Chapter 04 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 新增系統呼叫的啟示
Chapter 05 高效的多執行緒記錄檔
5.1 功能需求
5.2 效能需求
5.3 多執行緒非同步記錄檔
5.4 其他方案
第2 部分 muduo 網路函數庫
Chapter 06 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 常見的平行處理網路服務程式設計方案
Chapter 07 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 一種自動反射訊息類型的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 更多
Chapter 08 muduo 網路函數庫設計與實現
8.0 什麼都不做的EventLoop
8.1 Reactor 的關鍵結構
序/導讀
序
本書主要說明採用現代C++ 在x86-64 Linux 上撰寫多執行緒TCP 網路服務程式的主流標準技術,這也是我對過去5 年撰寫生產環境下的多執行緒服務端程式的經驗歸納。本書重點說明多執行緒網路服務器的一種IO 模型,即one loopper thread。這是一種適應性強的模型,也是Linux 下以native 語言撰寫使用者態高性能網路程式最成熟的模式,熟練之後可順利地開發各種常見的服務端網路應用程式。本書以muduo 網路函數庫為例,說明這種程式設計模型的使用方法及注意事項。
muduo 是一個以非阻塞IO 和事件驅動為基礎的現代C++ 網路函數庫,原生支援one loop per thread 這種IO 模型。muduo 適合開發Linux 下的針對業務的多執行緒服務端網路應用程式,其中「針對業務的網路程式設計」的定義見附錄A。「現代C++」指的不是C++11 新標準,而是2005 年TR1 發佈之後的C++ 語言和函數庫。與傳統C++ 相比,現代C++ 的變化主要有兩方面:資源管理(見第 1 章)與事件回呼(見第11-24 頁)。
本書不是多執行緒程式設計教學,也不是網路程式設計教學,更不是C++ 教學。讀者應該已經大致讀過《現代作業系統》、《UNIX 環境進階程式設計》、《UNIX 網路程式設計》、《C++ Primer》或與之內容相近的書籍,熟悉基本概念,並熟練 Pthreads 和 Sockets API 的正常用法。本書基本不談C++11,因為目前主流的Linux 服務端發行版本的g++ 版本都還停留在4.4,C++11 進入實用尚需一段時日。
本書適用的硬體環境是主流 x86-64 伺服器,多路多核心CPU、幾十GB 記憶體、GB 乙太網互連。除了第 5 章講診斷記錄檔之外,本書不涉及檔案IO。
本書分為四大部分,第1 部分「C++ 多執行緒系統程式設計」檢查多執行緒下的物件生命期管理、執行緒同步方法、多執行緒與C++ 的結合、高效的多執行緒記錄檔等。第2 部分「muduo 網路函數庫」介紹使用現成的非阻塞網路函數庫撰寫網路應用程式的方法,以及 muduo 的設計與實現。第3 部分「專案實作經驗談」介紹分散式系統的專案化開發方法和C++ 在專案實作中的功能特性取捨。第4 部分「附錄」分享網路程式設計和C++ 語言的學習經驗。
本書的宗旨是貴精不貴多。熟練兩種基本的同步基本操作就可以滿足各種多執行緒同步的功能需求,還能寫出更好用的同步設施。熟練一種處理程序間通訊方式和一種多執行緒網路程式設計模型就足以應對日常開發工作,撰寫執行於公司內網環境的分散式服務系統。(本書不涉及分散式儲存系統,也不涉及UDP。)
術語與排版範例
本書大量使用英文術語,甚至有少量英文引用。設計模式的名字一律用英文, 例如Observer、Reactor、Singleton。在中文術語不夠突出時, 也會使用英文, 例如class、heap、event loop、STL algorithm 等。注意幾個中文C++ 術語:物件實體(instance)、函數多載決議(resolution)、樣板實例化(instantiation)、覆載(override)虛擬函數、反參考(dereference)指標。本書中的英文可數名詞一般不用複數形式,例如兩個 class,6 個 syscall;但有時會用(s) 強調中文名詞是複數。fd 是檔案描述符號(file descriptor)的縮寫。「CPU 數目」一般指的是核心(core)的數目。容量單位kB、MB、GB 表示的位元組數分別為103、106、109,在特別強調準確數值時,會分別用 KiB、MiB、GiB 表示210、220、230 位元組。用諸如 §11.5 表示本書第 11.5 節,第42 行 表示上下文中出現的第 42 行程式。[JCP]、[CC2e] 等是參考文獻,見書末清單。
程式
本書的範例程式以開放原始碼專案的形式發佈在GitHub 上,網址是 http://github.com/ chenshuo/recipes/ 和 http://github.com/chenshuo/muduo/。本書搭配頁面提供全部原始程式碼包裝下載,正文中出現的類似 recipes/thread 的路徑是壓縮檔內的相對路徑,讀者不難找到其對應的GitHub URL。本書參考程式的形式如下,左側數字是檔案的行號,右側的「muduo/base/Types.h」是檔案路徑1。例如下面這幾行程式是
muduo::string 的 typedef。
15 namespace muduo
16 {
17
18 #ifdef MUDUO_STD_STRING
19 using std::string;
20 #else // !MUDUO_STD_STRING
21 typedef __gnu_cxx::__sso_string string;
22 #endif
本書假設讀者熟悉diff -u 指令的輸出格式,用於表示程式的改動。
本書正文中出現的程式有時為了照顧排版而略有改寫,例如改變縮排規則,去掉單行條件陳述式前後的大括號等。就程式設計風格而論,應以原始程式碼中的程式為準。
作者聯繫方式
電子郵件:giantchen@gmail.com
主頁:chenshuo.com/book (包含勘誤表和URL 清單)
微博:weibo.com/giantchen
部落格:blog.csdn.net/Solstice
程式:github.com/chenshuo
豆瓣:book.douban.com/subject/20471211
配送方式
-
台灣
- 國內宅配:本島、離島
-
到店取貨:
不限金額免運費
-
海外
- 國際快遞:全球
-
港澳店取:
詳細資料
詳細資料
-
- 語言
- 中文繁體
- 裝訂
- 紙本平裝
-
- ISBN
- 9789863792017
- 分級
- 普通級
-
- 頁數
- 688
- 商品規格
- 23*17
-
- 出版地
- 台灣
- 適讀年齡
- 全齡適讀
-
- 注音
- 級別
訂購/退換貨須知
退換貨須知:
**提醒您,鑑賞期不等於試用期,退回商品須為全新狀態**
-
依據「消費者保護法」第19條及行政院消費者保護處公告之「通訊交易解除權合理例外情事適用準則」,以下商品購買後,除商品本身有瑕疵外,將不提供7天的猶豫期:
- 易於腐敗、保存期限較短或解約時即將逾期。(如:生鮮食品)
- 依消費者要求所為之客製化給付。(客製化商品)
- 報紙、期刊或雜誌。(含MOOK、外文雜誌)
- 經消費者拆封之影音商品或電腦軟體。
- 非以有形媒介提供之數位內容或一經提供即為完成之線上服務,經消費者事先同意始提供。(如:電子書、電子雜誌、下載版軟體、虛擬商品…等)
- 已拆封之個人衛生用品。(如:內衣褲、刮鬍刀、除毛刀…等)
- 若非上列種類商品,均享有到貨7天的猶豫期(含例假日)。
- 辦理退換貨時,商品(組合商品恕無法接受單獨退貨)必須是您收到商品時的原始狀態(包含商品本體、配件、贈品、保證書、所有附隨資料文件及原廠內外包裝…等),請勿直接使用原廠包裝寄送,或於原廠包裝上黏貼紙張或書寫文字。
- 退回商品若無法回復原狀,將請您負擔回復原狀所需費用,嚴重時將影響您的退貨權益。
商品評價