內容介紹
本書是《C++編程思想》兩卷的匯總。第1卷是在第1版的基礎上進行了更加深入分析和修改後的第2版,其內容、講授方法、選用實例以及配套的練習別具特色,可以供不同程度的讀者選擇閱讀。第2卷介紹了C++實用的編程技術和最佳的實踐方法,深入探究了異常處理方法和異常安全設計;介紹C++的字元串、輸入輸出流的現代用法;解釋多重繼承問題的難點,描述了典型的設計模式及其實現,特別介紹了多執行緒處理編程技術。在本書作者的個人網站www.BruceEckel.com上提供:
? 本書的英文原文、原始碼、練習解答指南、勘誤表及補充材料。
? 本書相關內容的研討和諮詢。
? 本書第1卷及第2卷英文電子版的免費下載連結。
作者介紹
Bruce Eckel 是MindView公司的總裁,向客戶提供軟體諮詢和培訓。他是C++標準委員會擁有表決權的成員之一,他也是《Java編程思想》(該書第3版影印版及翻譯版已由機械工業出版社引進出版)。他曾經寫過另5本面向對象編程書籍,發表過150篇以上的文章,是多本計算機雜誌的專欄作家。他經常參加世界各地的研討會並進行演講。Chuck Allison 曾是《C/C++ Users》雜誌的資深編輯,著有《C/C++ Code Capsules》一書。他是C++標準委員會的成員,猶他谷州立學院的計算機科學教授。他還是Fresh Sources公司的總裁,該公司專門從事軟體培訓和教學任務。
作品目錄
出版者的話出版說明
第1卷 標準C++導引
譯者序 3
前言 5
第1章 對象導言 11
1.1 抽象的過程 11
1.2 對象有一個接口 12
1.3 實現的隱藏 14
1.4 實現的重用 15
1.5 繼承:重用接口 15
1.5.1 is-a 關係和is-like-a 關係 18
1.6 具有多態性的可互換對象 18
1.7 創建和銷毀對象 21
1.8 異常處理:應對錯誤 22
1.9 分析和設計 22
1.9.1 第0階段:制定計畫 24
1.9.2 第1階段:我們在做什麼 24
1.9.3 第2階段:我們將如何建立對象 26
1.9.4 第3階段:創建核心 28
1.9.5 第4階段:疊代用例 29
1.9.6 第5階段:進化 29
1.9.7 計畫的回報 30
1.10 極限編程 30
1.10.1 先寫測試 31
1.10.2 結對編程 32
1.11 為什麼C++會成功 32
1.11.1 一個較好的C 32
1.11.2 延續式的學習過程 33
1.11.3 效率 33
1.11.4 系統更容易表達和理解 33
1.11.5 儘量使用庫 33
1.11.6 利用模板的原始碼重用 34
1.11.7 錯誤處理 34
1.11.8 大型程式設計 34
1.12 為向OOP轉變而採取的策略 34
1.12.1 指導方針 35
1.12.2 管理的障礙 35
1.13 小結 37
第2章 對象的創建與使用 38
2.1 語言的翻譯過程 38
2.1.1 解釋器 38
2.1.2 編譯器 39
2.1.3 編譯過程 39
2.2 分段編譯工具 40
2.2.1 聲明與定義 40
2.2.2 連線 44
2.2.3 使用庫檔案 44
2.3 編寫第一個C++程式 45
2.3.1 使用iostream類 45
2.3.2 名字空間 46
2.3.3 程式的基本結構 47
2.3.4 “Hello, World!” 47
2.3.5 運行編譯器 48
2.4 關於輸入輸出流 48
2.4.1 字元數組的拼接 49
2.4.2 讀取輸入數據 49
2.4.3 調用其他程式 50
2.5 字元串簡介 50
2.6 檔案的讀寫 51
2.7 vector簡介 52
2.8 小結 55
2.9 練習 56
第3章 C++中的C 57
3.1 創建函式 57
3.1.1 函式的返回值 58
3.1.2 使用C的函式館 59
3.1.3 通過庫管理器創建自己的庫 59
3.2 執行控制語句 60
3.2.1 真和假 60
3.2.2 if-else語句 60
3.2.3 while語句 61
3.2.4 do-while語句 61
3.2.5 for語句 62
3.2.6 關鍵字break 和 continue 63
3.2.7 switch語句 64
3.2.8 使用和濫用goto 65
3.2.9 遞歸 65
3.3 運算符簡介 66
3.3.1 優先權 66
3.3.2 自增和自減 67
3.4 數據類型簡介 67
3.4.1 基本內建類型 67
3.4.2 bool類型與true和false 68
3.4.3 說明符 69
3.4.4 指針簡介 70
3.4.5 修改外部對象 72
3.4.6 C++引用簡介 74
3.4.7 用指針和引用作為修飾符 75
3.5 作用域 76
3.5.1 實時定義變數 77
3.6 指定存儲空間分配 78
3.6.1 全局變數 78
3.6.2 局部變數 79
3.6.3 靜態變數 80
3.6.4 外部變數 81
3.6.5 常量 82
3.6.6 volatile變數 83
3.7 運算符及其使用 83
3.7.1 賦值 83
3.7.2 數學運算符 83
3.7.3 關係運算符 85
3.7.4 邏輯運算符 85
3.7.5 位運算符 85
3.7.6 移位運算符 86
3.7.7 一元運算符 88
3.7.8 三元運算符 88
3.7.9 逗號運算符 89
3.7.10 使用運算符時的常見問題 89
3.7.11 轉換運算符 90
3.7.12 C++的顯式轉換 90
3.7.13 sizeof—獨立運算符 93
3.7.14 asm 關鍵字 94
3.7.15 顯式運算符 94
3.8 創建複合類型 94
3.8.1 用typedef命名別名 95
3.8.2 用struct把變數結合在一起 95
3.8.3 用enum提高程度清晰度 97
3.8.4 用union節省記憶體 98
3.8.5 數組 99
3.9 調試技巧 106
3.9.1 調試標記 106
3.9.2 把變數和表達式轉換成字元串 108
3.9.3 C語言assert( )宏 108
3.10 函式地址 109
3.10.1 定義函式指針 109
3.10.2 複雜的聲明和定義 109
3.10.3 使用函式指針 110
3.10.4 指向函式的指針數組 111
3.11 make:管理分段編譯 111
3.11.1 make的行為 112
3.11.2 本書中的makefile 114
3.11.3 makefile的一個例子 114
3.12 小結 116
3.13 練習 116
第4章 數據抽象 119
4.1 一個袖珍C庫 119
4.1.1 動態存儲分配 122
4.1.2 有害的猜測 124
4.2 哪兒出問題 125
4.3 基本對象 126
4.4 什麼是對象 130
4.5 抽象數據類型 131
4.6 對象細節 131
4.7 頭檔案形式 132
4.7.1 頭檔案的重要性 132
4.7.2 多次聲明問題 133
4.7.3 預處理器指示#define、#ifdef
和#endif 134
4.7.4 頭檔案的標準 134
4.7.5 頭檔案中的名字空間 135
4.7.6 在項目中使用頭檔案 135
4.8 嵌套結構 136
4.8.1 全局作用域解析 138
4.9 小結 139
4.10 練習 139
第5章 隱藏實現 142
5.1 設定限制 142
5.2 C++的訪問控制 142
5.2.1 protected說明符 144
5.3 友元 144
5.3.1 嵌套友元 146
5.3.2 它是純面向對象的嗎 148
5.4 對象布局 148
5.5 類 149
5.5.1 用訪問控制來修改Stash 151
5.5.2 用訪問控制來修改Stack 151
5.6 句柄類 152
5.6.1 隱藏實現 152
5.6.2 減少重複編譯 152
5.7 小結 154
5.8 練習 154
第6章 初始化與清除 156
6.1 用構造函式確保初始化 156
6.2 用析構函式確保清除 157
6.3 清除定義塊 159
6.3.1 for循環 160
6.3.2 記憶體分配 161
6.4 帶有構造函式和析構函式的Stash 162
6.5 帶有構造函式和析構函式的Stack 164
6.6 聚合初始化 166
6.7 默認構造函式 168
6.8 小結 169
6.9 練習 169
第7章 函式重載與默認參數 171
7.1 名字修飾 172
7.1.1 用返回值重載 172
7.1.2 類型安全連線 172
7.2 重載的例子 173
7.3 聯合 176
7.4 默認參數 178
7.4.1 占位符參數 179
7.5 選擇重載還是默認參數 180
7.6 小結 183
7.7 練習 183
第8章 常量 185
8.1 值替代 185
8.1.1 頭檔案里的const 186
8.1.2 const的安全性 186
8.1.3 聚合 187
8.1.4 與C語言的區別 187
8.2 指針 188
8.2.1 指向const的指針 189
8.2.2 const指針 189
8.2.3 賦值和類型檢查 190
8.3 函式參數和返回值 191
8.3.1 傳遞const值 191
8.3.2 返回const值 191
8.3.3 傳遞和返回地址 193
8.4 類 195
8.4.1 類里的const 196
8.4.2 編譯期間類里的常量 198
8.4.3 const對象和成員函式 200
8.5 volatile 204
8.6 小結 205
8.7 練習 205
第9章 內聯函式 207
9.1 預處理器的缺陷 207
9.1.1 宏和訪問 209
9.2 內聯函式 210
9.2.1 類內部的內聯函式 210
9.2.2 訪問函式 211
9.3 帶內聯函式的Stash和Stack 215
9.4 內聯函式和編譯器 218
9.4.1 限制 219
9.4.2 向前引用 219
9.4.3 在構造函式和析構函數裡隱藏行為 220
9.5 減少混亂 220
9.6 預處理器的更多特徵 221
9.6.1 標誌貼上 222
9.7 改進的錯誤檢查 222
9.8 小結 225
9.9 練習 225
第10章 名字控制 227
10.1 來自C語言中的靜態元素 227
10.1.1 函式內部的靜態變數 227
10.1.2 控制連線 230
10.1.3 其他存儲類型說明符 232
10.2 名字空間 232
10.2.1 創建一個名字空間 232
10.2.2 使用名字空間 234
10.2.3 名字空間的使用 237
10.3 C++中的靜態成員 238
10.3.1 定義靜態數據成員的存儲 238
10.3.2 嵌套類和局部類 241
10.3.3 靜態成員函式 242
10.4 靜態初始化的相依性 244
10.4.1 怎么辦 245
10.5 替代連線說明 250
10.6 小結 250
10.7 練習 251
第11章 引用和拷貝構造函式 254
11.1 C++中的指針 254
11.2 C++中的引用 254
11.2.1 函式中的引用 255
11.2.2 參數傳遞準則 257
11.3 拷貝構造函式 257
11.3.1 按值傳遞和返回 257
11.3.2 拷貝構造函式 261
11.3.3 默認拷貝構造函式 265
11.3.4 替代拷貝構造函式的方法 266
11.4 指向成員的指針 267
11.4.1 函式 269
11.5 小結 271
11.6 練習 271
第12章 運算符重載 274
12.1 兩個極端 274
12.2 語法 274
12.3 可重載的運算符 275
12.3.1 一元運算符 276
12.3.2 二元運算符 279
12.3.3 參數和返回值 288
12.3.4 不常用的運算符 290
12.3.5 不能重載的運算符 295
12.4 非成員運算符 296
12.4.1 基本方針 297
12.5 重載賦值符 297
12.5.1 operator=的行為 298
12.6 自動類型轉換 306
12.6.1 構造函式轉換 306
12.6.2 運算符轉換 307
12.6.3 類型轉換例子 309
12.6.4 自動類型轉換的缺陷 310
12.7 小結 312
12.8 練習 312
第13章 動態對象創建 315
13.1 對象創建 315
13.1.1 C從堆中獲取存儲單元的方法 316
13.1.2 operator new 317
13.1.3 operator delete 317
13.1.4 一個簡單的例子 318
13.1.5 記憶體管理的開銷 318
13.2 重新設計前面的例子 319
13.2.1 使用delete void*可能會出錯 319
13.2.2 對指針的清除責任 320
13.2.3 指針的Stash 320
13.3 用於數組的new和delete 324
13.3.1 使指針更像數組 325
13.4 耗盡記憶體 325
13.5 重載new和delete 326
13.5.1 重載全局new和delete 327
13.5.2 對於一個類重載new和delete 328
13.5.3 為數組重載new和delete 330
13.5.4 構造函式調用 332
13.5.5 定位new和delete 333
13.6 小結 334
13.7 練習 334
第14章 繼承和組合 336
14.1 組合語法 336
14.2 繼承語法 337
14.3 構造函式的初始化表達式表 339
14.3.1 成員對象初始化 339
14.3.2 在初始化表達式表中的內建類型 339
14.4 組合和繼承的聯合 340
14.4.1 構造函式和析構函式調用的次序 341
14.5 名字隱藏 343
14.6 非自動繼承的函式 346
14.6.1 繼承和靜態成員函式 349
14.7 組合與繼承的選擇 349
14.7.1子類型設定 350
14.7.2 私有繼承 352
14.8 protected 353
14.8.1 protected繼承 353
14.9 運算符的重載與繼承 353
14.10 多重繼承 355
14.11 漸增式開發 355
14.12 向上類型轉換 356
14.12.1 為什麼要“向上類型轉換” 357
14.12.2 向上類型轉換和拷貝構造函式 357
14.12.3 組合與繼承(再論) 359
14.12.4 指針和引用的向上類型轉換 360
14.12.5 危機 360
14.13 小結 361
14.14 練習 361
第15章 多態性和虛函式 364
15.1 C++程式設計師的演變 364
15.2 向上類型轉換 365
15.3 問題 366
15.3.1 函式調用捆綁 366
15.4 虛函式 366
15.4.1 擴展性 367
15.5 C++如何實現晚捆綁 369
15.5.1 存放類型信息 370
15.5.2 虛函式功能圖示 371
15.5.3 撩開面紗 372
15.5.4 安裝vpointer 373
15.5.5 對象是不同的 373
15.6 為什麼需要虛函式 374
15.7 抽象基類和純虛函式 375
15.7.1 純虛定義 378
15.8 繼承和VTABLE 378
15.8.1 對象切片 380
15.9 重載和重新定義 382
15.9.1 變數返回類型 383
15.10 虛函式和構造函式 385
15.10.1 構造函式調用次序 385
15.10.2 虛函式在構造函式中的行為 386
15.11 析構函式和虛擬析構函式 386
15.11.1 純虛析構函式 388
15.11.2 析構函式中的虛機制 389
15.11.3 創建基於對象的繼承 390
15.12 運算符重載 392
15.13 向下類型轉換 394
15.14 小結 396
15.15 練習 397
第16章 模板介紹 400
16.1 容器 400
16.1.1 容器的需求 401
16.2 模板綜述 402
16.2.1 模板方法 403
16.3 模板語法 404
16.3.1 非內聯函式定義 405
16.3.2 作為模板的IntStack 406
16.3.3 模板中的常量 408
16.4 作為模板的Stash和Stack 409
16.4.1 模板化的指針Stash 411
16.5 打開和關閉所有權 415
16.6 以值存放對象 417
16.7 疊代器簡介 418
16.7.1 帶有疊代器的棧 425
16.7.2 帶有疊代器的PStash 427
16.8 為什麼使用疊代器 432
16.8.1 函式模板 434
16.9 小結 435
16.10 練習 435
附錄A 編碼風格
附錄B 編程準則
附錄C 推薦讀物
第2卷 實用編程技術
譯者序 441
前言 442
第一部分 建立穩定的系統
第1章 異常處理 448
1.1 傳統的錯誤處理 448
1.2 拋出異常 450
1.3 捕獲異常 451
1.3.1 try塊 451
1.3.2 異常處理器 451
1.3.3 終止和恢復 452
1.4 異常匹配 453
1.4.1 捕獲所有異常 454
1.4.2 重新拋出異常 454
1.4.3 不捕獲異常 455
1.5 清理 456
1.5.1 資源管理 457
1.5.2 使所有事物都成為對象 458
1.5.3 auto_ptr 460
1.5.4 函式級的try塊 461
1.6 標準異常 462
1.7 異常規格說明 464
1.7.1 更好的異常規格說明 467
1.7.2 異常規格說明和繼承 467
1.7.3 什麼時候不使用異常規格說明 468
1.8 異常安全 468
1.9 在編程中使用異常 471
1.9.1 什麼時候避免異常 471
1.9.2 異常的典型套用 472
1.10 使用異常造成的開銷 474
1.11 小結 476
1.12 練習 476
第2章 防禦性編程 478
2.1 斷言 480
2.2 一個簡單的單元測試框架 482
2.2.1 自動測試 483
2.2.2 TestSuite框架 485
2.2.3 測試套件 488
2.2.4 測試框架的原始碼 489
2.3 調試技術 493
2.3.1 用於代碼跟蹤的宏 494
2.3.2 跟蹤檔案 494
2.3.3 發現記憶體泄漏 495
2.4 小結 499
2.5 練習 500
第二部分 標準C++庫
第3章 深入理解字元串 504
3.1 字元串的內部是什麼 504
3.2 創建並初始化C++字元串 505
3.3 對字元串進行操作 508
3.3.1 追加、插入和連線字元串 508
3.3.2 替換字元串中的字元 509
3.3.3 使用非成員重載運算符連線 512
3.4 字元串的查找 513
3.4.1 反向查找 516
3.4.2 查找一組字元第1次或最後一次出現的位置 517
3.4.3 從字元串中刪除字元 519
3.4.4 字元串的比較 520
3.4.5 字元串和字元的特性 523
3.5 字元串的套用 527
3.6 小結 531
3.7 練習 531
第4章 輸入輸出流 534
4.1 為什麼引入輸入輸出流 534
4.2 救助輸入輸出流 537
4.2.1 插入符和提取符 537
4.2.2 通常用法 540
4.2.3 按行輸入 541
4.3 處理流錯誤 542
4.4 檔案輸入輸出流 544
4.4.1 一個檔案處理的例子 544
4.4.2 打開模式 546
4.5 輸入輸出流緩衝 546
4.6 在輸入輸出流中定位 548
4.7 字元串輸入輸出流 550
4.7.1 輸入字元串流 551
4.7.2 輸出字元串流 552
4.8 輸出流的格式化 555
4.8.1 格式化標誌 555
4.8.2 格式化域 556
4.8.3 寬度、填充和精度設定 557
4.8.4 一個完整的例子 557
4.9 操縱運算元 560
4.9.1 帶參數的操縱運算元 560
4.9.2 創建操縱運算元 562
4.9.3 效用運算元 563
4.10 輸入輸出流程式舉例 565
4.10.1 維護類庫的原始碼 565
4.10.2 檢測編譯器錯誤 568
4.10.3 一個簡單的數據記錄器 570
4.11 國際化 573
4.11.1 寬字元流 574
4.11.2 區域性字元流 575
4.12 小結 577
4.13 練習 577
第5章 深入理解模板 580
5.1 模板參數 580
5.1.1 無類型模板參數 580
5.1.2 默認模板參數 582
5.1.3 模板類型的模板參數 583
5.1.4 typename關鍵字 587
5.1.5 以template關鍵字作為提示 588
5.1.6 成員模板 589
5.2 有關函式模板的幾個問題 591
5.2.1 函式模板參數的類型推斷 591
5.2.2 函式模板重載 594
5.2.3 以一個已生成的函式模板地址作為參數 595
5.2.4 將函式套用到STL序列容器中 598
5.2.5 函式模板的半有序 600
5.3 模板特化 601
5.3.1 顯式特化 601
5.3.2 半特化 602
5.3.3 一個實例 604
5.3.4 防止模板代碼膨脹 606
5.4 名稱查找問題 609
5.4.1 模板中的名稱 609
5.4.2 模板和友元 613
5.5 模板編程中的習語 617
5.5.1 特徵 617
5.5.2 策略 621
5.5.3 奇特的遞歸模板模式 623
5.6 模板元編程 624
5.6.1 編譯時編程 625
5.6.2 表達式模板 631
5.7 模板編譯模型 636
5.7.1 包含模型 636
5.7.2 顯式實例化 637
5.7.3 分離模型 638
5.8 小結 639
5.9 練習 640
第6章 通用算法 642
6.1 概述 642
6.1.1 判定函式 644
6.1.2 流疊代器 646
6.1.3 算法複雜性 647
6.2 函式對象 648
6.2.1 函式對象的分類 649
6.2.2 自動創建函式對象 649
6.2.3 可調整的函式對象 652
6.2.4 更多的函式對象例子 653
6.2.5 函式指針適配器 658
6.2.6 編寫自己的函式對象適配器 662
6.3 STL算法目錄 665
6.3.1 實例創建的支持工具 666
6.3.2 填充和生成 669
6.3.3 計數 670
6.3.4 操作序列 671
6.3.5 查找和替換 674
6.3.6 比較範圍 679
6.3.7 刪除元素 681
6.3.8 對已排序的序列進行排序和運算 684
6.3.9 堆運算 691
6.3.10 對某一範圍內的所有元素進行運算 691
6.3.11 數值算法 697
6.3.12 通用實用程式 699
6.4 創建自己的STL風格算法 700
6.5 小結 701
6.6 練習 702
第7章 通用容器 706
7.1 容器和疊代器 706
7.2 概述 707
7.2.1 字元串容器 711
7.2.2 從STL容器繼承 712
7.3 更多疊代器 714
7.3.1 可逆容器中的疊代器 715
7.3.2 疊代器的種類 716
7.3.3 預定義疊代器 717
7.4 基本序列容器:vector、list和deque 721
7.4.1 基本序列容器的操作 721
7.4.2 向量 723
7.4.3 雙端佇列 728
7.4.4 序列容器間的轉換 730
7.4.5 被檢查的隨機訪問 731
7.4.6 鍊表 732
7.4.7 交換序列 736
7.5 集合 737
7.6 堆疊 743
7.7 佇列 745
7.8 優先佇列 748
7.9 持有二進制位 755
7.9.1 bitset<n> 756
7.9.2 vector<bool> 758
7.10 關聯式容器 760
7.10.1 用於關聯式容器的發生器和填充器 763
7.10.2 不可思議的映像 765
7.10.3 多重映像和重複的關鍵字 766
7.10.4 多重集合 768
7.11 將STL容器聯合使用 771
7.12 清除容器的指針 773
7.13 創建自己的容器 774
7.14 對STL的擴充 776
7.15 非STL容器 777
7.16 小結 781
7.17 練習 781
第三部分 專 題
第8章 運行時類型識別 785
8.1 運行時類型轉換 785
8.2 typeid 操作符 789
8.2.1 類型轉換到中間層次類型 790
8.2.2 void型指針 791
8.2.3 運用帶模板的RTTI 792
8.3 多重繼承 793
8.4 合理使用RTTI 793
8.5 RTTI的機制和開銷 797
8.6 小結 797
8.7 練習 798
第9章 多重繼承 800
9.1 概論 800
9.2 接口繼承 801
9.3 實現繼承 803
9.4 重複子對象 807
9.5 虛基類 810
9.6 名字查找問題 817
9.7 避免使用多重繼承 819
9.8 擴充一個接口 820
9.9 小結 823
9.10 練習 823
第10章 設計模式 825
10.1 模式的概念 825
10.2 模式分類 826
10.3 簡化習語 827
10.3.1 信使 827
10.3.2 收集參數 828
10.4 單件 829
10.5 命令:選擇操作 833
10.6 消除對象耦合 836
10.6.1 代理模式:作為其他對象的前端 837
10.6.2 狀態模式:改變對象的行為 838
10.7 適配器模式 840
10.8 模板方法模式 841
10.9 策略模式:運行時選擇算法 842
10.10 職責鏈模式:嘗試採用一系列
策略模式 843
10.11 工廠模式:封裝對象的創建 845
10.11.1 多態工廠 847
10.11.2 抽象工廠 849
10.11.3 虛構造函式 851
10.12 構建器模式:創建複雜對象 855
10.13 觀察者模式 860
10.13.1 “內部類”方法 862
10.13.2 觀察者模式舉例 864
10.14 多重派遣 867
10.15 小結 873
10.16 練習 873
第11章 並發 875
11.1 動機 875
11.2 C++中的並發 876
11.3 定義任務 878
11.4 使用執行緒 879
11.4.1 創建有回響的用戶界面 880
11.4.2 使用執行器簡化工作 882
11.4.3 讓步 884
11.4.4 休眠 885
11.4.5 優先權 886
11.5 共享有限資源 887
11.5.1 保證對象的存在 887
11.5.2 不恰當地訪問資源 890
11.5.3 訪問控制 892
11.5.4 使用保護簡化編碼 893
11.5.5 執行緒本地存儲 896
11.6 終止任務 897
11.6.1 防止輸入/輸出流衝突 897
11.6.2 舉例觀賞植物園 898
11.6.3 阻塞時終止 901
11.6.4 中斷 902
11.7 執行緒間協作 906
11.7.1 等待和信號 906
11.7.2 生產者-消費者關係 909
11.7.3 用佇列解決執行緒處理的問題 912
11.7.4 廣播 916
11.8 死鎖 921
11.9 小結 925
11.10 練習 926
附 錄
附錄A 推薦讀物
附錄B 其他