內容簡介
《C++標準庫(第2版)》是全球
C++經典權威參考書籍時隔12年,基於C++11標準的全新重大升級。標準庫提供了一組公共類和
接口,極大地拓展了C++語言核心功能。《C++標準庫(第2版)》詳細講解了每一標準庫組件,包括其設計目的和方法、複雜概念的剖析、實用而高效的編程細節、存在的陷阱、重要的類和函式,又輔以大量用C++11標準實現的實用代碼範例。除覆蓋全新組件、特性外,《C++標準庫(第2版)》一如前版,重點著眼於標準模板庫(STL),涉及容器、
疊代器、函式對象以及
STL算法。此外,《C++標準庫(第2版)》同樣關注lambda表達式、基於區間的for循環、move語義及可變參數模板等標準庫中的新式C++編程風格及其影響。
作者簡介
Nicolai M. Josuttis是一名獨立技術顧問,為電信、交通、金融和製造業設計過大中型軟體系統。他曾是C++標準委員會庫工作小組成員,因其權威著作而在編程領域聲名鵲起。除了最為暢銷的《C++標準庫》(第1版出版於1999年),其著作還包括C++ Templates: The Complete Guide(與David Vandevoorde合著,由Addison-Wesley於2003年出版),以及SOA in Practice: The Art of Distributed System Design(由O’Reilly Media於2007年出版,簡體中文版《SOA實踐指南——分散式系統設計的藝術》由電子工業出版社於2008年出版)。
譯者侯捷:計算機技術書籍的作家、譯者、書評人,長期活躍於C++技術分享與教學領域。著有《深入淺出MFC》《多型與虛擬》《STL源碼剖析》《無責任書評》三卷,譯有眾多膾炙人口的權威技術書籍,包括Meyers所著的“Effective C++”系列。侯捷兼任教職於元智大學、同濟大學、南京大學。
圖書目錄
第 2 版譯序 xxi
第 2 版序言 xxiii
第 2 版致謝 xxiv
第 1 版序言 xxv
第 1 版致謝 xxvi
1 關於本書 1
1.1 緣起 1
1.2 閱讀前的必要基礎 2
1.3 本書風格與結構 2
1.4 如何閱讀本書 4
1.5 目前發展情勢 5
1.6 範例代碼及額外信息 5
1.7 反饋 5
2 C++ 及標準庫簡介 7
2.1 C++ Standard 的歷史 7
2.1.1 C++11 Standard 常見疑問 8
2.1.2 C++98 和 C++11 的兼容性 9
2.2 複雜度與 Big-O 標記 10
3 語言新特性 13
3.1 C++11 語言新特性 13
3.1.1 微小但重要的語法提升 13
3.1.2 以auto完成類型自動推導 14
3.1.3 一致性初始化(Uniform Initialization)與初值列(Initializer List) 15
3.1.4 Range-Based for循環 17
3.1.5 Move 語義和 Rvalue Reference 19
3.1.6 新式的字元串字面常量(String Literal) 23
3.1.7 關鍵字noexcept 24
3.1.8 關鍵字constexpr 26
3.1.9 嶄新的 Template 特性 26
3.1.10 Lambda 28
3.1.11 關鍵字decltype 32
3.1.12 新的函式聲明語法(New Function Declaration Syntax) 32
3.1.13 帶領域的(Scoped) Enumeration 32
3.1.14 新的基礎類型(New Fundamental Data Type) 33
3.2 雖舊猶新的語言特性 33
3.2.1 基礎類型的明確初始化(Explicit Initialization for Fundamental Type) 37
3.2.2 main( )定義式 37
4 一般概念 39
4.1 命名空間(Namespace)std 39
4.2 頭檔案(Header File) 40
4.3 差錯和異常(Error and Exception)的處理 41
4.3.1 標準的 Exception Class(異常類) 41
4.3.2 異常類(Exception Class)的成員 44
4.3.3 以 Class exception_ptr傳遞異常 52
4.3.4 拋出標準異常 53
4.3.5 自標準異常類派生 54
4.4 Callable Object(可被調用的對象) 54
4.5 並發與多執行緒 55
4.6 分配器(Allocator) 57
5 通用工具 59
5.1 Pair 和 Tuple 60
5.1.1 Pair 60
5.1.2 Tuple(不定數的值組) 68
5.1.3 Tuple 的輸入/輸出 74
5.1.4 tuple和pair轉換 75
5.2 Smart Pointer(智慧型指針) 76
5.2.1 Class shared_ptr 76
5.2.2 Class weak_ptr 84
5.2.3 誤用 Shared Pointer 89
5.2.4 細究 Shared Pointer 和 Weak Pointer 92
5.2.5 Class unique_ptr 98
5.2.6 細究 Class unique_ptr 110
5.2.7 Class auto_ptr 113
5.2.8 Smart Pointer 結語 114
5.3 數值的極值(Numeric Limit) 115
5.4 Type Trait 和 Type Utility 122
5.4.1 Type Trait 的目的 122
5.4.2 細究 Type Trait 125
5.4.3 Reference Wrapper(外覆器) 132
5.4.4 Function Type Wrapper(外覆器) 133
5.5 輔助函式 134
5.5.1 挑選最小值和最大值 134
5.5.2 兩值互換(Swapping) 136
5.5.3 增補的“比較操作符”(Comparison Operator) 138
5.6 Class ratio< >的編譯期分數運算 140
5.7 Clock 和 Timer 143
5.7.1 Chrono 程式庫概觀 143
5.7.2 Duration(時間段) 144
5.7.3 Clock(時鐘)和 Timepoint(時間點) 149
5.7.4 C 和 POSIX 提供的 Date/Time 函式 157
5.7.5 以計時器停滯執行緒(Blocking with Timer) 160
5.8 頭檔案、和161
5.8.1內的各項定義 161
5.8.2內的各種定義 162
5.8.3中的定義式 163
6 標準模板庫 165
6.1 STL 組件(Component) 165
6.2 容器(Container) 167
6.2.1 序列式容器(Sequence Container) 169
6.2.2 關聯式容器(Associative Container) 177
6.2.3 無序容器(Unordered Container) 180
6.2.4 關聯式數組(Associative Array) 185
6.2.5 其他容器 187
6.2.6 容器適配器(Container Adapter) 188
6.3 疊代器(Iterator) 188
6.3.1 關聯式( Associative )及無序( Unordered )容器的更多實例 193
6.3.2 疊代器種類(Iterator Category) 198
6.4 算法(Algorithm) 199
6.4.1 區間(Range) 203
6.4.2 處理多重區間(Multiple Ranges) 207
6.5 疊代器之適配器(Iterator Adapter) 210
6.5.1 Insert Iterator(安插型疊代器) 210
6.5.2 Stream Iterator(串流疊代器) 212
6.5.3 Reverse Iterator(反向疊代器) 214
6.5.4 Move Iterator(搬移疊代器) 216
6.6 用戶自定義的泛型函式(User-Defined Generic Function) 216
6.7 更易型算法(Manipulating Algorithm) 217
6.7.1 移除(Removing)元素 218
6.7.2 更易 Associative(關聯式)和 Unordered(無序)容器 221
6.7.3 算法 vs. 成員函式 223
6.8 以函式作為算法的實參 224
6.8.1 以函式作為算法實參的實例示範 224
6.8.2 判斷式(Predicate) 226
6.9 使用 Lambda 229
6.10 函式對象(Function Object) 233
6.10.1 定義一個函式對象 233
6.10.2 預定義的函式對象 239
6.10.3 Binder 241
6.10.4 函式對象 vs. Lambda 243
6.11 容器內的元素 244
6.11.1 容器元素的必要條件 244
6.11.2 Value 語義 vs. Reference 語義 245
6.12 STL 內部的錯誤和異常 245
6.12.1 錯誤處理(Error Handling) 246
6.12.2 異常處理(Exception Handling) 248
6.13 擴展 STL 250
6.13.1 整合更多 Type 250
6.13.2 派生自 STL Type 251
7 STL 容器 253
7.1 容器的共通能力和共通操作 254
7.1.1 容器的共通能力 254
7.1.2 容器的共通操作 254
7.1.3 容器提供的類型 260
7.2 Array 261
7.2.1 Array 的能力 261
7.2.2 Array 的操作 263
7.2.3 把array當成 C-Style Array 267
7.2.4 異常處理( Exception Handling ) 268
7.2.5 Tuple 接口 268
7.2.6 Array 運用實例 268
7.3 Vector 270
7.3.1 Vector 的能力 270
7.3.2 Vector 的操作 273
7.3.3 將 Vector 當作 C-Style Array 使用 278
7.3.4 異常處理( Exception Handling ) 278
7.3.5 Vector 使用實例 279
7.3.6 Class vector281
7.4 Deque 283
7.4.1 Deque 的能力 284
7.4.2 Deque 的操作函式 284
7.4.3 Exception Handling 288
7.4.4 Deque 運用實例 288
7.5 List 290
7.5.1 List 的能力 290
7.5.2 List 的操作 291
7.5.3 異常處理( Exception Handling ) 296
7.5.4 List 運用實例 298
7.6 Forward List 300
7.6.1 Forward List 的能力 300
7.6.2 Forward List 的操作 302
7.6.3 異常處理( Exception Handling ) 311
7.6.4 Forward List 運用實例 312
7.7 Set 和 Multiset 314
7.7.1 Set 和 Multiset 的能力 315
7.7.2 Set and Multiset 的操作函式 316
7.7.3 異常處理( Exception Handling ) 325
7.7.4 Set 和 Multiset 運用實例 325
7.7.5 運行期指定排序準則 328
7.8 Map 和 Multimap 331
7.8.1 Map 和 Multimap 的能力 332
7.8.2 Map 和 Multimap 的操作函式 333
7.8.3 將 Map 視為關聯式數組( Associative Array ) 343
7.8.4 異常處理( Exception Handling ) 345
7.8.5 Map 和 Multimap 運用實例 345
7.8.6 綜合實例:運用 Map、 String 並於運行期指定排序準則 351
7.9 無序容器( Unordered Container ) 355
7.9.1 Unordered 容器的能力 357
7.9.2 創建和控制 Unordered 容器 359
7.9.3 Unordered 容器的其他操作 367
7.9.4 Bucket 接口 374
7.9.5 使用 Unordered Map 作為 Associative Array 374
7.9.6 異常處理( Exception Handling ) 375
7.9.7 Unordered 容器的運用實例 375
7.10 其他 STL 容器 385
7.10.1 String 作為一種 STL 容器 385
7.10.2 C-Style Array 作為一種 STL 容器 386
7.11 實現 Reference 語義 388
7.12 各種容器的使用時機 392
8 細探 STL 容器成員 397
8.1 容器內的類型 397
8.2 創建、複製和銷毀( Create, Copy, and Destroy ) 400
8.3 非更易型操作( Nonmodifying Operation ) 403
8.3.1 大小相關操作( Size Operation ) 403
8.3.2 元素比較( Comparison Operation ) 404
8.3.3 Associative 和 Unordered 容器特有的非更易型操作 404
8.4 賦值( Assignment ) 406
8.5 元素直接訪問( Direct Element Access ) 408
8.6 “產出疊代器”之各項操作 410
8.7 安插和移除( Inserting and Removing )元素 411
8.7.1 安插單一元素( Inserting Single Element ) 411
8.7.2 安插多重元素( Inserting Multiple Elements ) 416
8.7.3 移除元素( Removing Element ) 417
8.7.4 重設大小( Resizing ) 420
8.8 List 和 Forward List 的特殊成員函式 420
8.8.1 特殊成員函式(針對 List 和 Forward List ) 420
8.8.2 特殊成員函式(只針對 Forward List ) 423
8.9 容器的策略接口( Policy Interface ) 427
8.9.1 非更易型策略函式( Nonmodifying Policy Function ) 427
8.9.2 更易型策略函式( Modifying Policy Function ) 428
8.9.3 Unordered 容器的 Bucket 相關接口 429
8.10 對分配器( Allocator )的支持 430
8.10.1 基本的分配器成員( Fundamental Allocator Member ) 430
8.10.2 帶有“可選之分配器參數”的構造函式 430
9 STL 疊代器 433
9.1 疊代器頭檔案( Header Files for Iterators ) 433
9.2 疊代器種類( Iterator Category ) 433
9.2.1 Output 疊代器 433
9.2.2 Input 疊代器 435
9.2.3 Forward(前向)疊代器 436
9.2.4 Bidirectional(雙向)疊代器 437
9.2.5 Random-Access(隨機訪問)疊代器 438
9.2.6 Vector 疊代器的遞增( Increment )和遞減( Decrement ) 440
9.3 疊代器相關輔助函式 441
9.3.1 advance( ) 441
9.3.2 next( )和prev( ) 443
9.3.3 distance( ) 445
9.3.4 iter_swap( ) 446
9.4 疊代器適配器( Iterator Adapter ) 448
9.4.1 Reverse(反向)疊代器 448
9.4.2 Insert(安插型)疊代器 454
9.4.3 Stream(串流)疊代器 460
9.4.4 Move(搬移)疊代器 466
9.5 Iterator Trait(疊代器特性) 466
9.5.1 為疊代器編寫泛型函式( Generic Function ) 468
9.6 用戶自定義( User-Defined )疊代器 471
10 STL 函式對象及 Lambda 475
10.1 Function Object(函式對象)的概念 475
10.1.1 以 Function Object 為排序準則( Sorting Criterion ) 476
10.1.2 Function Object 擁有內部狀態( Internal State ) 478
10.1.3 for_each( )的返回值 482
10.1.4 Predicate(判斷式) vs. Function Object(函式對象) 483
10.2 預定義的 Function Object 和 Binder 486
10.2.1 預定義的 Function Object 486
10.2.2 Function Adapter 和 Binder 487
10.2.3 以 Function Adapter 搭配用戶自定義的 Function Object 495
10.2.4 過時的( Deprecated ) Function Adapter 497
10.3 運用 Lambda 499
10.3.1 Lambda vs. Binder 499
10.3.2 Lambda vs. 帶有狀態的( Stateful ) Function Object 500
10.3.3 Lambda 調用全局函式和成員函式 502
10.3.4 Lambda 作為 Hash 函式、排序準則或相等準則 504
11 STL 算法 505
11.1 算法頭檔案(Header File) 505
11.2 算法概觀 505
11.2.1 扼要介紹 506
11.2.2 算法分門別類 506
11.3 輔助函式 517
11.4 for_each( )算法 519
11.5 非更易型算法(Nonmodifying Algorithm) 524
11.5.1 元素計數 524
11.5.2 最小值和最大值 525
11.5.3 查找元素(Searching Element) 528
11.5.4 區間的比較 542
11.5.5 Predicate 用以檢驗區間 550
11.6 更易型算法(Modifying Algorithm) 557
11.6.1 複製元素(Copying Element) 557
11.6.2 搬移元素(Moving Element) 561
11.6.3 轉換和結合元素(Transforming and Combining Element) 563
11.6.4 互換元素(Swapping Elements) 566
11.6.5 賦值(Assigning New Value) 568
11.6.6 替換元素(Replacing Element) 571
11.7 移除型算法(Removing Algorithm) 575
11.7.1 移除某些元素 575
11.7.2 移除重複元素 578
11.8 變序型算法(Mutating Algorithm) 583
11.8.1 反轉元素次序(Reversing the Order of Elements) 583
11.8.2 旋轉元素(Rotating Elements) 584
11.8.3 排列元素(Permuting Elements) 587
11.8.4 對元素重新洗牌(Shuffling Elements) 589
11.8.5 將元素向前搬(Moving Elements to the Front) 592
11.8.6 劃分為兩個子區間(Partition into Two Subranges) 594
11.9 排序算法(Sorting Algorithm) 596
11.9.1 對所有元素排序 596
11.9.2 局部排序(Partial Sorting) 599
11.9.3 根據第 {\itshape n} 個元素排序 602
11.9.4 Heap 算法 604
11.10 已序區間算法(Sorted-Range Algorithm) 608
11.10.1 查找元素(Searching Element) 608
11.10.2 合併元素(Merging Elements) 614
11.11 數值算法(Numeric Algorithm) 623
11.11.1 運算後產生結果 623
11.11.2 相對數列和絕對數列之間的轉換 627
12 特殊容器 631
12.1 Stack(堆疊) 632
12.1.1 核心接口 633
12.1.2 Stack 運用實例 633
12.1.3 一個用戶自定義的 Stack Class 635
12.1.4 細究 Class stack< > 637
12.2 Queue(佇列) 638
12.2.1 核心接口 639
12.2.2 Queue 運用實例 640
12.2.3 一個用戶自定義的 Queue Class 641
12.2.4 細究 Class queue< > 641
12.3 Priority Queue(帶優先權的佇列) 641
12.3.1 核心接口 643
12.3.2 Priority Queue 運用實例 643
12.3.3 細究 Class priority_queue< > 644
12.4 細究 Container Adapter 645
12.4.1 類型定義 645
12.4.2 構造函式(Constructor) 646
12.4.3 Priority Queue 額外提供的構造函式 646
12.4.4 各項操作(Operation) 647
12.5 Bitset 650
12.5.1 Bitset 運用實例 651
12.5.2 細究 Class bitset 653
13 字元串 655
13.1 String Class 的目的 656
13.1.1 例一:提煉臨時檔案名稱 656
13.1.2 例二:提煉單詞並反向列印 660
13.2 String Class 細節描述 663
13.2.1 String 的各種相關類型 663
13.2.2 操作函式概覽 666
13.2.3 構造函式和析構函式(Constructor and Destructor) 667
13.2.4 String 和 C-String 668
13.2.5 大小和容量(Size and Capacity) 669
13.2.6 元素訪問(Element Access) 671
13.2.7 比較(Comparison) 672
13.2.8 更改內容(Modifier) 673
13.2.9 子字元串(Substring)及字元串接合(String Concatenation) 676
13.2.10 I/O 操作符 677
13.2.11 搜尋和查找(Searching and Finding) 678
13.2.12 npos的意義 680
13.2.13 數值轉換(Numeric Conversion) 681
13.2.14 String 對疊代器的支持 684
13.2.15 國際化(Internationalization) 689
13.2.16 效率(Performance) 692
13.2.17 String 和 Vector 692
13.3 細究 String Class 693
13.3.1 類型定義和靜態值 693
13.3.2 創建、複製、銷毀(Create, Copy, and Destroy) 694
13.3.3 大小和容量(Size and Capacity) 696
13.3.4 比較(Comparison) 697
13.3.5 字元訪問 699
13.3.6 產生 C-String 和字元數組(Character Array) 700
13.3.7 “改動”之相關操作(Modifying Operation) 700
13.3.8 查找(Searching and Finding) 708
13.3.9 子字元串(Substring)及字元串接合(String Concatenation) 711
13.3.10 I/O函式 712
13.3.11 數值轉換(Numeric Conversion) 713
13.3.12 生成 Iterator 714
13.3.13 對 Allocator 的支持 715
14 正則表達式 717
14.1 Regex 的匹配和查找接口(Match and Search Interface) 717
14.2 處理“次表達式”(Subexpression) 720
14.3 Regex Iterator 726
14.4 Regex Token Iterator 727
14.5 用於替換的正則表達式 730
14.6 Regex Flag 732
14.7 Regex 的異常(Exception) 735
14.8 Regex ECMAScript 文法 738
14.9 其他文法 739
14.10 細究 Basic Regex 簽名式 740
15 以 Stream 完成 I/O 743
15.1 I/O Stream 的共通基礎(Common Background) 744
15.1.1 Stream 對象 744
15.1.2 Stream Class 744
15.1.3 全局的 Stream 對象 745
15.1.4 Stream 操作符 745
15.1.5 操控器(Manipulator) 746
15.1.6 一個簡單例子 746
15.2 基本 Stream Class 和其對象 748
15.2.1 Class 及其層次體系 748
15.2.2 全局性的 Stream 對象 751
15.2.3 頭檔案 752
15.3 標準的 Stream 操作符<<和>> 753
15.3.1 Output 操作符<< 753
15.3.2 Input 操作符>> 754
15.3.3 特殊類型的 I/O 755
15.4 Stream 的狀態(State) 758
15.4.1 表示“ Stream 狀態”的常量 758
15.4.2 用來“處理 Stream 狀態”的成員函式 759
15.4.3 Stream 狀態與 Boolean 條件測試 760
15.4.4 Stream 的狀態和異常 762
15.5 標準 I/O 函式 767
15.5.1 Input 相關函式 768
15.5.2 Output 相關函式 771
15.5.3 實例 772
15.5.4 sentry對象 772
15.6 操控器(Manipulator) 774
15.6.1 操控器概覽 774
15.6.2 操控器如何運作 776
15.6.3 用戶自定義的操控器 777
15.7 格式化(Formatting) 779
15.7.1 Format Flag(格式標誌) 779
15.7.2 Boolean 的 I/O 格式 781
15.7.3 欄位寬度、填充字元、位置調整 781
15.7.4 正號與大寫 784
15.7.5 數值基底(Numeric Base) 785
15.7.6 浮點數(Floating-Point)表示法 787
15.7.7 一般格式(General Formatting)定義 789
15.8 國際化(Internationalization) 790
15.9 檔案訪問(File Access) 791
15.9.1 File Stream Class 791
15.9.2 File Stream 的 Rvalue 和 Move 語義 795
15.9.3 File Flag(檔案標誌) 796
15.9.4 隨機訪問(Random Access) 799
15.9.5 使用檔案描述器(File Descriptor) 801
15.10 為 String 而設計的 Stream Class 802
15.10.1 String Stream Class 802
15.10.2 String Stream 的 Move 語義 806
15.10.3 char* Stream Class 807
15.11 “用戶自定義類型”之 I/O 操作符 810
15.11.1 實現一個 Output 操作符 810
15.11.2 實現一個 Input 操作符 812
15.11.3 以輔助函式完成 I/O 814
15.11.4 用戶自定義之 Format Flag(格式標誌) 815
15.11.5 用戶自定義 I/O 操作符的規約(Convention) 818
15.12 連線 Input 和 Output Stream 819
15.12.1 以tie( )完成松耦合(Loose Coupling) 819
15.12.2 以 Stream 緩衝區完成緊耦合(Tight Coupling) 820
15.12.3 將標準 Stream 重定向(Redirecting) 822
15.12.4 可讀可寫的 Stream 824
15.13 Stream Buffer Class 826
15.13.1 Stream 緩衝區接口 826
15.13.2 Stream 緩衝區的 Iterator 828
15.13.3 用戶自定義之 Stream 緩衝區 832
15.14 關於效能(Performance) 844
15.14.1 與 C 標準串流同步(Synchronization with C's Standard Streams) 845
15.14.2 Stream 緩衝區內的緩衝機制 845
15.14.3 直接使用 Stream 緩衝區 846
16 國際化 849
16.1 字元編碼和字元集 850
16.1.1 多位元組(Multibyte)和寬字元(Wide-Character)文本 850
16.1.2 不同的字元集 851
16.1.3 在 C++ 中處理字元集 852
16.1.4 Character Trait 853
16.1.5 特殊字元的國際化 857
16.2 Locale(地域)概念 857
16.2.1 使用 Locale 858
16.2.2 Locale Facet 864
16.3 細究 Locale 866
16.4 細究 Facet 869
16.4.1 數值格式化(Numeric Formatting) 870
16.4.2 貨幣符號格式化(Monetary Formatting) 874
16.4.3 時間和日期格式化(Time and Date Formatting) 884
16.4.4 字元的分類和轉換 891
16.4.5 字元串校勘(String Collation) 904
16.4.6 訊息國際化(Internationalized Message) 905
17 數值 907
17.1 隨機數及分布(Random Number and Distribution) 907
17.1.1 第一個例子 908
17.1.2 引擎(Engine) 912
17.1.3 細說引擎(Engine) 915
17.1.4 分布(Distribution) 917
17.1.5 細說分布(Distribution) 921
17.2 複數(Complex Number) 925
17.2.1 Class complex< >一般性質 925
17.2.2 Class complex< >運用實例 926
17.2.3 複數的各項操作 928
17.2.4 細說 Class complex< > 935
17.3 全局數值函式(Global Numeric Function) 941
17.4 Valarray 943
18 並發 945
18.1 高級接口:async( )和 Future 946
18.1.1 async( )和 Future 的第一個用例 946
18.1.2 實例:等待兩個 Task 955
18.1.3 Shared Future 960
18.2 低層接口:Thread 和 Promise 964
18.2.1 Class std::thread 964
18.2.2 Promise 969
18.2.3 Class packaged_task< > 972
18.3 細說啟動執行緒(Starting a Thread) 973
18.3.1 細說async( ) 974
18.3.2 細說 Future 975
18.3.3 細說 Shared Future 976
18.3.4 細說 Class std::promise 977
18.3.5 細說 Class std::packaged_task 977
18.3.6 細說 Class std::thread 979
18.3.7 Namespace this_thread 981
18.4 執行緒同步化與 Concurrency(並發)問題 982
18.4.1 當心 Concurrency(並發) 982
18.4.2 Concurrent Data Access 為什麼造成問題 983
18.4.3 什麼情況下可能出錯 983
18.4.4 解決問題所需要的性質(Feature) 987
18.5 Mutex 和 Lock 989
18.5.1 使用 Mutex 和 Lock 989
18.5.2 細說 Mutex 和 Lock 998
18.5.3 只調用一次 1000
18.6 Condition Variable(條件變數) 1003
18.6.1 Condition Variable(條件變數)的意圖 1003
18.6.2 Condition Variable(條件變數)的第一個完整例子 1004
18.6.3 使用 Condition Variable(條件變數)實現多執行緒 Queue 1006
18.6.4 細說 Condition Variable(條件變數) 1009
18.7 Atomic 1012
18.7.1 Atomic 用例 1012
18.7.2 細說 Atomic 及其高級接口 1016
18.7.3 Atomic 的 C-Style 接口 1019
18.7.4 Atomic 的低層接口 1019
19 分配器 1023
19.1 以應用程式開發者的角度使用 Allocator 1023
19.2 用戶自定義的 Allocator 1024
19.3 以程式庫開發者的角度使用 Allocator 1026
參考書目 1031
新聞組及論壇( Newsgroup and Forum ) 1031
書籍和網站 1032
索引 1037