Linux多綫程服務端編程

Linux多綫程服務端編程 pdf epub mobi txt 電子書 下載2025

出版者:電子工業齣版社
作者:陳碩
出品人:博文視點
頁數:610
译者:
出版時間:2013-1-15
價格:89.00元
裝幀:平裝
isbn號碼:9787121192821
叢書系列:
圖書標籤:
  • 網絡編程
  • Linux
  • C++
  • 多綫程
  • 計算機
  • 編程
  • C/C++
  • Networks
  • Linux
  • 多綫程
  • 服務端編程
  • 網絡編程
  • C++
  • POSIX綫程
  • 並發編程
  • 係統編程
  • 高性能
  • 服務器開發
  • TCP/IP
想要找書就要到 圖書目錄大全
立刻按 ctrl+D收藏本頁
你會得到大驚喜!!

具體描述

本書主要講述采用現代C++ 在x86-64 Linux 上編寫多綫程TCP 網絡服務程序的主流常規技術,重點講解一種適應性較強的多綫程服務器的編程模型,即one loop per thread。這是在Linux 下以native 語言編寫用戶態高性能網絡程序最成熟的模式,掌握之後可順利地開發各類常見的服務端網絡應用程序。本書以muduo 網絡庫為例,講解這種編程模型的使用方法及注意事項。

本書的宗旨是貴精不貴多。掌握兩種基本的同步原語就可以滿足各種多綫程同步的功能需求,還能寫齣更易用的同步設施。掌握一種進程間通信方式和一種多綫程網絡編程模型就足以應對日常開發任務,編寫運行於公司內網環境的分布式服務統。

作者簡介

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

目錄資訊

第1 部分C++ 多綫程係統編程1
第1章 綫程安全的對象生命期管理3
1.1 當析構函數遇到多綫程. . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.1.1 綫程安全的定義. . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.1.2 MutexLock 與MutexLockGuard . . . . . . . . . . . . . . . . . . . . 4
1.1.3 一個綫程安全的Counter 示例. . . . . . . . . . . . . . . . . . . . 4
1.2 對象的創建很簡單. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3 銷毀太難. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.3.1 mutex 不是辦法. . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.3.2 作為數據成員的mutex 不能保護析構. . . . . . . . . . . . . . . 8
1.4 綫程安全的Observer 有多難. . . . . . . . . . . . . . . . . . . . . . . . . 8
1.5 原始指針有何不妥. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.6 神器shared_ptr/weak_ptr . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.7 插麯:係統地避免各種指針錯誤. . . . . . . . . . . . . . . . . . . . . . . 14
1.8 應用到Observer 上. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.9 再論shared_ptr 的綫程安全. . . . . . . . . . . . . . . . . . . . . . . . . 17
1.10 shared_ptr 技術與陷阱. . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.11 對象池. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.11.1 enable_shared_from_this . . . . . . . . . . . . . . . . . . . . . . 23
1.11.2 弱迴調. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
1.12 替代方案. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
1.13 心得與小結. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
1.14 Observer 之謬. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
第2章 綫程同步精要31
2.1 互斥器(mutex) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.1.1 隻使用非遞歸的mutex . . . . . . . . . . . . . . . . . . . . . . . . 33
2.1.2 死鎖. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
2.2 條件變量(condition variable) . . . . . . . . . . . . . . . . . . . . . . . 40
2.3 不要用讀寫鎖和信號量. . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.4 封裝MutexLock、MutexLockGuard、Condition . . . . . . . . . . . . . . 44
2.5 綫程安全的Singleton 實現. . . . . . . . . . . . . . . . . . . . . . . . . . 48
2.6 sleep(3) 不是同步原語. . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
2.7 歸納與總結. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
2.8 藉shared_ptr 實現copy-on-write . . . . . . . . . . . . . . . . . . . . . . 52
第3章 多綫程服務器的適用場閤與常用編程模型59
3.1 進程與綫程. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
3.2 單綫程服務器的常用編程模型. . . . . . . . . . . . . . . . . . . . . . . . 61
3.3 多綫程服務器的常用編程模型. . . . . . . . . . . . . . . . . . . . . . . . 62
3.3.1 one loop per thread . . . . . . . . . . . . . . . . . . . . . . . . . . 62
3.3.2 綫程池. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
3.3.3 推薦模式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
3.4 進程間通信隻用TCP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
3.5 多綫程服務器的適用場閤. . . . . . . . . . . . . . . . . . . . . . . . . . . 67
3.5.1 必須用單綫程的場閤. . . . . . . . . . . . . . . . . . . . . . . . . 69
3.5.2 單綫程程序的優缺點. . . . . . . . . . . . . . . . . . . . . . . . . 70
3.5.3 適用多綫程程序的場景. . . . . . . . . . . . . . . . . . . . . . . . 71
3.6 “多綫程服務器的適用場閤”例釋與答疑. . . . . . . . . . . . . . . . . . 74
第4章 C++ 多綫程係統編程精要83
4.1 基本綫程原語的選用. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
4.2 C/C++ 係統庫的綫程安全性. . . . . . . . . . . . . . . . . . . . . . . . . 85
4.3 Linux 上的綫程標識. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
4.4 綫程的創建與銷毀的守則. . . . . . . . . . . . . . . . . . . . . . . . . . . 91
4.4.1 pthread_cancel 與C++ . . . . . . . . . . . . . . . . . . . . . . . 94
4.4.2 exit(3) 在C++ 中不是綫程安全的. . . . . . . . . . . . . . . . . 94
4.5 善用__thread 關鍵字. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
4.6 多綫程與IO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
4.7 用RAII 包裝文件描述符. . . . . . . . . . . . . . . . . . . . . . . . . . . 99
4.8 RAII 與fork() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
4.9 多綫程與fork() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
4.10 多綫程與signal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
4.11 Linux 新增係統調用的啓示. . . . . . . . . . . . . . . . . . . . . . . . . . 105
第5章 高效的多綫程日誌107
5.1 功能需求. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
5.2 性能需求. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
5.3 多綫程異步日誌. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
5.4 其他方案. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
第2部分 muduo 網絡庫123
第6章 muduo 網絡庫簡介125
6.1 由來. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
6.2 安裝. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
6.3 目錄結構. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
6.3.1 代碼結構. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
6.3.2 例子. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
6.3.3 綫程模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
6.4 使用教程. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
6.4.1 TCP 網絡編程本質論. . . . . . . . . . . . . . . . . . . . . . . . . 136
6.4.2 echo 服務的實現. . . . . . . . . . . . . . . . . . . . . . . . . . . 138
6.4.3 七步實現finger 服務. . . . . . . . . . . . . . . . . . . . . . . . . 140
6.5 性能評測. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
6.5.1 muduo 與Boost.Asio、libevent2 的吞吐量對比. . . . . . . . . . 145
6.5.2 擊鼓傳花:對比muduo 與libevent2 的事件處理效率. . . . . . 148
6.5.3 muduo 與Nginx 的吞吐量對比. . . . . . . . . . . . . . . . . . . 153
6.5.4 muduo 與ZeroMQ 的延遲對比. . . . . . . . . . . . . . . . . . . 156
6.6 詳解muduo 多綫程模型. . . . . . . . . . . . . . . . . . . . . . . . . . . 157
6.6.1 數獨求解服務器. . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
6.6.2 常見的並發網絡服務程序設計方案. . . . . . . . . . . . . . . . . 160
第7章 muduo 編程示例177
7.1 五個簡單TCP 示例. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
7.2 文件傳輸. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
7.3 Boost.Asio 的聊天服務器. . . . . . . . . . . . . . . . . . . . . . . . . . . 194
7.3.1 TCP 分包. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
7.3.2 消息格式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
7.3.3 編解碼器LengthHeaderCodec . . . . . . . . . . . . . . . . . . . . 197
7.3.4 服務端的實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
7.3.5 客戶端的實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
7.4 muduo Buffer 類的設計與使用. . . . . . . . . . . . . . . . . . . . . . . 204
7.4.1 muduo 的IO 模型. . . . . . . . . . . . . . . . . . . . . . . . . . 204
7.4.2 為什麼non-blocking 網絡編程中應用層buffer 是必需的. . . . 205
7.4.3 Buffer 的功能需求. . . . . . . . . . . . . . . . . . . . . . . . . . 207
7.4.4 Buffer 的數據結構. . . . . . . . . . . . . . . . . . . . . . . . . . 209
7.4.5 Buffer 的操作. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
7.4.6 其他設計方案. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
7.4.7 性能是不是問題. . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
7.5 一種自動反射消息類型的Google Protobuf 網絡傳輸方案. . . . . . . . 220
7.5.1 網絡編程中使用Protobuf 的兩個先決條件. . . . . . . . . . . . . 220
7.5.2 根據type name 反射自動創建Message 對象. . . . . . . . . . . . 221
7.5.3 Protobuf 傳輸格式. . . . . . . . . . . . . . . . . . . . . . . . . . 226
7.6 在muduo 中實現Protobuf 編解碼器與消息分發器. . . . . . . . . . . . 228
7.6.1 什麼是編解碼器(codec) . . . . . . . . . . . . . . . . . . . . . . 229
7.6.2 實現ProtobufCodec . . . . . . . . . . . . . . . . . . . . . . . . . 232
7.6.3 消息分發器(dispatcher)有什麼用. . . . . . . . . . . . . . . . 232
7.6.4 ProtobufCodec 與ProtobufDispatcher 的綜閤運用. . . . . . . 233
7.6.5 ProtobufDispatcher 的兩種實現. . . . . . . . . . . . . . . . . . 234
7.6.6 ProtobufCodec 和ProtobufDispatcher 有何意義. . . . . . . . . 236
7.7 限製服務器的最大並發連接數. . . . . . . . . . . . . . . . . . . . . . . . 237
7.7.1 為什麼要限製並發連接數. . . . . . . . . . . . . . . . . . . . . . 237
7.7.2 在muduo 中限製並發連接數. . . . . . . . . . . . . . . . . . . . 238
7.8 定時器. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
7.8.1 程序中的時間. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
7.8.2 Linux 時間函數. . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
7.8.3 muduo 的定時器接口. . . . . . . . . . . . . . . . . . . . . . . . . 242
7.8.4 Boost.Asio Timer 示例. . . . . . . . . . . . . . . . . . . . . . . . 243
7.8.5 Java Netty 示例. . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
7.9 測量兩颱機器的網絡延遲和時間差. . . . . . . . . . . . . . . . . . . . . 248
7.10 用timing wheel 踢掉空閑連接. . . . . . . . . . . . . . . . . . . . . . . . 250
7.10.1 timing wheel 原理. . . . . . . . . . . . . . . . . . . . . . . . . . 251
7.10.2 代碼實現與改進. . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
7.11 簡單的消息廣播服務. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
7.12 “串並轉換”連接服務器及其自動化測試. . . . . . . . . . . . . . . . . . 260
7.13 socks4a 代理服務器. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
7.13.1 TCP 中繼器. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
7.13.2 socks4a 代理服務器. . . . . . . . . . . . . . . . . . . . . . . . . . 267
7.13.3 N : 1 與1 : N 連接轉發. . . . . . . . . . . . . . . . . . . . . . . . 267
7.14 短址服務. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
7.15 與其他庫集成. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
7.15.1 UDNS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
7.15.2 c-ares DNS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
7.15.3 curl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
7.15.4 更多. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
第8章 muduo 網絡庫設計與實現277
8.0 什麼都不做的EventLoop . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
8.1 Reactor 的關鍵結構. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
8.1.1 Channel class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
8.1.2 Poller class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
8.1.3 EventLoop 的改動. . . . . . . . . . . . . . . . . . . . . . . . . . . 287
8.2 TimerQueue 定時器. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
8.2.1 TimerQueue class . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
8.2.2 EventLoop 的改動. . . . . . . . . . . . . . . . . . . . . . . . . . . 292
8.3 EventLoop::runInLoop() 函數. . . . . . . . . . . . . . . . . . . . . . . . 293
8.3.1 提高TimerQueue 的綫程安全性. . . . . . . . . . . . . . . . . . . 296
8.3.2 EventLoopThread class . . . . . . . . . . . . . . . . . . . . . . . . 297
8.4 實現TCP 網絡庫. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
8.5 TcpServer 接受新連接. . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
8.5.1 TcpServer class . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
8.5.2 TcpConnection class . . . . . . . . . . . . . . . . . . . . . . . . . 305
8.6 TcpConnection 斷開連接. . . . . . . . . . . . . . . . . . . . . . . . . . . 308
8.7 Buffer 讀取數據. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
8.7.1 TcpConnection 使用Buffer 作為輸入緩衝. . . . . . . . . . . . . 314
8.7.2 Buffer::readFd() . . . . . . . . . . . . . . . . . . . . . . . . . . 315
8.8 TcpConnection 發送數據. . . . . . . . . . . . . . . . . . . . . . . . . . . 316
8.9 完善TcpConnection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
8.9.1 SIGPIPE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
8.9.2 TCP No Delay 和TCP keepalive . . . . . . . . . . . . . . . . . . 321
8.9.3 WriteCompleteCallback 和HighWaterMarkCallback . . . . . . . 322
8.10 多綫程TcpServer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
8.11 Connector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
8.12 TcpClient . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
8.13 epoll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
8.14 測試程序一覽. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
第3部分 工程實踐經驗談337
第9章 分布式係統工程實踐339
9.1 我們在技術浪潮中的位置. . . . . . . . . . . . . . . . . . . . . . . . . . . 341
9.1.1 分布式係統的本質睏難. . . . . . . . . . . . . . . . . . . . . . . . 343
9.1.2 分布式係統是個險惡的問題. . . . . . . . . . . . . . . . . . . . . 344
9.2 分布式係統的可靠性淺說. . . . . . . . . . . . . . . . . . . . . . . . . . . 349
9.2.1 分布式係統的軟件不要求7 24 可靠. . . . . . . . . . . . . . . . 352
9.2.2 “能隨時重啓進程”作為程序設計目標. . . . . . . . . . . . . . . 354
9.3 分布式係統中心跳協議的設計. . . . . . . . . . . . . . . . . . . . . . . . 356
9.4 分布式係統中的進程標識. . . . . . . . . . . . . . . . . . . . . . . . . . . 360
9.4.1 錯誤做法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
9.4.2 正確做法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
9.4.3 TCP 協議的啓示. . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
9.5 構建易於維護的分布式程序. . . . . . . . . . . . . . . . . . . . . . . . . 364
9.6 為係統演化做準備. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
9.6.1 可擴展的消息格式. . . . . . . . . . . . . . . . . . . . . . . . . . 368
9.6.2 反麵教材:ICE 的消息打包格式. . . . . . . . . . . . . . . . . . . 369
9.7 分布式程序的自動化迴歸測試. . . . . . . . . . . . . . . . . . . . . . . . 370
9.7.1 單元測試的能與不能. . . . . . . . . . . . . . . . . . . . . . . . . 370
9.7.2 分布式係統測試的要點. . . . . . . . . . . . . . . . . . . . . . . . 373
9.7.3 分布式係統的抽象觀點. . . . . . . . . . . . . . . . . . . . . . . . 374
9.7.4 一種自動化的迴歸測試方案. . . . . . . . . . . . . . . . . . . . . 375
9.7.5 其他用處. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
9.8 分布式係統部署、監控與進程管理的幾重境界. . . . . . . . . . . . . . . 380
9.8.1 境界1:全手工操作. . . . . . . . . . . . . . . . . . . . . . . . . 382
9.8.2 境界2:使用零散的自動化腳本和第三方組件. . . . . . . . . . . 383
9.8.3 境界3:自製機群管理係統,集中化配置. . . . . . . . . . . . . 386
9.8.4 境界4:機群管理與naming service 結閤. . . . . . . . . . . . . 389
第10章 C++ 編譯鏈接模型精要391
10.1 C 語言的編譯模型及其成因. . . . . . . . . . . . . . . . . . . . . . . . . 394
10.1.1 為什麼C 語言需要預處理. . . . . . . . . . . . . . . . . . . . . . 395
10.1.2 C 語言的編譯模型. . . . . . . . . . . . . . . . . . . . . . . . . . . 398
10.2 C++ 的編譯模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399
10.2.1 單遍編譯. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399
10.2.2 前嚮聲明. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
10.3 C++ 鏈接(linking) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
10.3.1 函數重載. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
10.3.2 inline 函數. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
10.3.3 模闆. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409
10.3.4 虛函數. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
10.4 工程項目中頭文件的使用規則. . . . . . . . . . . . . . . . . . . . . . . . 415
10.4.1 頭文件的害處. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416
10.4.2 頭文件的使用規則. . . . . . . . . . . . . . . . . . . . . . . . . . 417
10.5 工程項目中庫文件的組織原則. . . . . . . . . . . . . . . . . . . . . . . . 418
10.5.1 動態庫是有害的. . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
10.5.2 靜態庫也好不到哪兒去. . . . . . . . . . . . . . . . . . . . . . . . 424
10.5.3 源碼編譯是王道. . . . . . . . . . . . . . . . . . . . . . . . . . . . 428
第11章 反思C++ 麵嚮對象與虛函數429
11.1 樸實的C++ 設計. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
11.2 程序庫的二進製兼容性. . . . . . . . . . . . . . . . . . . . . . . . . . . . 431
11.2.1 什麼是二進製兼容性. . . . . . . . . . . . . . . . . . . . . . . . . 432
11.2.2 有哪些情況會破壞庫的ABI . . . . . . . . . . . . . . . . . . . . . 433
11.2.3 哪些做法多半是安全的. . . . . . . . . . . . . . . . . . . . . . . . 435
11.2.4 反麵教材:COM . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
11.2.5 解決辦法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436
11.3 避免使用虛函數作為庫的接口. . . . . . . . . . . . . . . . . . . . . . . . 436
11.3.1 C++ 程序庫的作者的生存環境. . . . . . . . . . . . . . . . . . . . 437
11.3.2 虛函數作為庫的接口的兩大用途. . . . . . . . . . . . . . . . . . 438
11.3.3 虛函數作為接口的弊端. . . . . . . . . . . . . . . . . . . . . . . . 439
11.3.4 假如Linux 係統調用以COM 接口方式實現. . . . . . . . . . . . 442
11.3.5 Java 是如何應對的. . . . . . . . . . . . . . . . . . . . . . . . . . 443
11.4 動態庫接口的推薦做法. . . . . . . . . . . . . . . . . . . . . . . . . . . . 443
11.5 以boost::function 和boost::bind 取代虛函數. . . . . . . . . . . . . 447
11.5.1 基本用途. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
11.5.2 對程序庫的影響. . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
11.5.3 對麵嚮對象程序設計的影響. . . . . . . . . . . . . . . . . . . . . 453
11.6 iostream 的用途與局限. . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
11.6.1 stdio 格式化輸入輸齣的缺點. . . . . . . . . . . . . . . . . . . . . 457
11.6.2 iostream 的設計初衷. . . . . . . . . . . . . . . . . . . . . . . . . 461
11.6.3 iostream 與標準庫其他組件的交互. . . . . . . . . . . . . . . . . 463
11.6.4 iostream 在使用方麵的缺點. . . . . . . . . . . . . . . . . . . . . 464
11.6.5 iostream 在設計方麵的缺點. . . . . . . . . . . . . . . . . . . . . 468
11.6.6 一個300 行的memory buffer output stream . . . . . . . . . . . 476
11.6.7 現實的C++ 程序如何做文件IO . . . . . . . . . . . . . . . . . . . 480
11.7 值語義與數據抽象. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
11.7.1 什麼是值語義. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
11.7.2 值語義與生命期. . . . . . . . . . . . . . . . . . . . . . . . . . . . 483
11.7.3 值語義與標準庫. . . . . . . . . . . . . . . . . . . . . . . . . . . . 488
11.7.4 值語義與C++ 語言. . . . . . . . . . . . . . . . . . . . . . . . . . 488
11.7.5 什麼是數據抽象. . . . . . . . . . . . . . . . . . . . . . . . . . . . 490
11.7.6 數據抽象所需的語言設施. . . . . . . . . . . . . . . . . . . . . . 493
11.7.7 數據抽象的例子. . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
第12章 C++ 經驗談501
12.1 用異或來交換變量是錯誤的. . . . . . . . . . . . . . . . . . . . . . . . . 501
12.1.1 編譯器會分彆生成什麼代碼. . . . . . . . . . . . . . . . . . . . . 503
12.1.2 為什麼短的代碼不一定快. . . . . . . . . . . . . . . . . . . . . . 505
12.2 不要重載全局::operator new() . . . . . . . . . . . . . . . . . . . . . . 507
12.2.1 內存管理的基本要求. . . . . . . . . . . . . . . . . . . . . . . . . 507
12.2.2 重載::operator new() 的理由. . . . . . . . . . . . . . . . . . . 508
12.2.3 ::operator new() 的兩種重載方式. . . . . . . . . . . . . . . . . 508
12.2.4 現實的開發環境. . . . . . . . . . . . . . . . . . . . . . . . . . . . 509
12.2.5 重載::operator new() 的睏境. . . . . . . . . . . . . . . . . . . 510
12.2.6 解決辦法:替換malloc() . . . . . . . . . . . . . . . . . . . . . . 512
12.2.7 為單獨的class 重載::operator new() 有問題嗎. . . . . . . . . 513
12.2.8 有必要自行定製內存分配器嗎. . . . . . . . . . . . . . . . . . . . 513
12.3 帶符號整數的除法與餘數. . . . . . . . . . . . . . . . . . . . . . . . . . . 514
12.3.1 語言標準怎麼說. . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
12.3.2 C/C++ 編譯器的錶現. . . . . . . . . . . . . . . . . . . . . . . . . 516
12.3.3 其他語言的規定. . . . . . . . . . . . . . . . . . . . . . . . . . . . 516
12.3.4 腳本語言解釋器代碼. . . . . . . . . . . . . . . . . . . . . . . . . 517
12.3.5 硬件實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521
12.4 在單元測試中mock 係統調用. . . . . . . . . . . . . . . . . . . . . . . . 522
12.4.1 係統函數的依賴注入. . . . . . . . . . . . . . . . . . . . . . . . . 522
12.4.2 鏈接期墊片(link seam) . . . . . . . . . . . . . . . . . . . . . . 524
12.5 慎用匿名namespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526
12.5.1 C 語言的static 關鍵字的兩種用法. . . . . . . . . . . . . . . . . 526
12.5.2 C++ 語言的static 關鍵字的四種用法. . . . . . . . . . . . . . . . 526
12.5.3 匿名namespace 的不利之處. . . . . . . . . . . . . . . . . . . . . 527
12.5.4 替代辦法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
12.6 采用有利於版本管理的代碼格式. . . . . . . . . . . . . . . . . . . . . . . 529
12.6.1 對diff 友好的代碼格式. . . . . . . . . . . . . . . . . . . . . . . . 530
12.6.2 對grep 友好的代碼風格. . . . . . . . . . . . . . . . . . . . . . . 537
12.6.3 一切為瞭效率. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538
12.7 再探std::string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539
12.7.1 直接拷貝(eager copy) . . . . . . . . . . . . . . . . . . . . . . . 540
12.7.2 寫時復製(copy-on-write) . . . . . . . . . . . . . . . . . . . . . 542
12.7.3 短字符串優化(SSO) . . . . . . . . . . . . . . . . . . . . . . . . 543
12.8 用STL algorithm 輕鬆解決幾道算法麵試題. . . . . . . . . . . . . . . . 546
12.8.1 用next_permutation() 生成排列與組閤. . . . . . . . . . . . . . 546
12.8.2 用unique() 去除連續重復空白. . . . . . . . . . . . . . . . . . . 548
12.8.3 用{make,push,pop}_heap() 實現多路歸並. . . . . . . . . . . . 549
12.8.4 用partition() 實現“重排數組,讓奇數位於偶數前麵” . . . . 553
12.8.5 用lower_bound() 查找IP 地址所屬的城市. . . . . . . . . . . . . 554
第4 部分附錄559
附錄A 談一談網絡編程學習經驗561
附錄B 從《C++ Primer(第4 版)》入手學習C++ 579
附錄C 關於Boost 的看法591
附錄D 關於TCP 並發連接的幾個思考題與試驗593
參考文獻599
· · · · · · (收起)

讀後感

評分

个人感受,这本书写的非常好,也非常用心。但悲观的说,如果一遍看不懂的话,主要是因为缺乏经验。而且,我也并不认为缺乏经验的同学会通过只看书看几次就能看懂。 我觉得技术书籍可能分为几个层次。最上层可能是哲学,中层可能是方法论,最下层是技术说明。比如,技术说明可...  

評分

最近,有一位朋友因为工作需要,需要从网游的客户端编程转向服务器端编程,找我推荐一本书。我推荐了《Linux 多线程服务器端编程——使用 muduo C++ 网络库》给他,他在网上书店看了以后问我为什么推荐这么厚一本书给他,正好这本书我已经早就看完了,一直也想写篇“书评”,就...  

評分

应该算是一本好书,推荐。如果能把此书读通,对以后肯定帮助大大的。但是难度肯定是有的,遇到不懂得地方多上网查查,不要轻易放弃。这本书对多线程的服务器端编程写的挺详细的。 本书的宗旨是贵精不贵多。掌握两种基本的同步原语就可以满足各种多线程同步的功能需求,还能写出...  

評分

poll模型最关键的算法是如何调度线程池来处理有读写的连接,但是本书在4400位置附近只提了一句:「muduo目前采用最简单的round-robin算法来选取poll中的EventLoop...」。 为什么有问题?1、采用轮询的方法不能保证线程之间调度的公平(即使线程池采用和CPU核数相同的线程数并绑...  

評分

9.1分,尼玛,坑谁呢。。。。。 看这里,比较客观 http://ar.newsmth.net/thread-c64b61785ba061.html muduo适用于什么环境? muduo的官方一句话自我介绍是:A C++ non-blocking multi-threaded network library for Linux。 在其readme和wiki中均未提及此lib是否适用于...  

用戶評價

评分

半本C++工程實踐半本mudo源碼解析,雖然有些實踐主張不贊同(或許和領域有關)但是這本書確實有不少乾貨。

评分

讀過,但是還是沒吃透。。

评分

好書,好人!

评分

非常感謝陳碩同學寄來的書,其實不少內容在博客上都分享過,品質精良。仔仔細細的通讀瞭一遍,學到的麵其實很廣:C++,多綫程,Linux下的網絡編程,分布式係統,協議的設計,麵試,工作方法,代碼標準。。。 陳碩可能僅僅年長我一歲,但是其技術水平不知高我幾個檔次瞭。 遺憾的是這次雖然仔仔細細的讀瞭下來,但並沒有著手時間。鑒於對數據分析的興趣,相信之後在涉及到分布式計算的時候還會重拾本書。

评分

書中參考文獻隻有6本沒讀過……但是跟chenshuo的工程功底比起來,真的是吹牛派跟實踐派的差距

本站所有內容均為互聯網搜索引擎提供的公開搜索信息,本站不存儲任何數據與內容,任何內容與數據均與本站無關,如有需要請聯繫相關搜索引擎包括但不限於百度google,bing,sogou

© 2025 qciss.net All Rights Reserved. 小哈圖書下載中心 版权所有