天天看點

《C++ Concurrency in Action》中文版内容介紹目錄譯者簡介

2014年馬上就到了,借此文感謝各位同學一直以來對并發程式設計網的支援和厚愛,祝大家新年快樂,并在新的一年裡事事馬到成功!在新的一年裡如果您對并發程式設計網有什麼要求,請隻管在本文的回複裡告訴我們。

至此新春之際,并發網和人民郵電出版社将在2014年向大家推送《c++ concurrency in action》中文版的樣章,該書即将登場,而并發程式設計網讓大家先睹為快!本文是第一篇,主要是包含本書的内容介紹,目錄和譯者介紹。喜歡的話請猛點贊。

本書是一本基于c++11新标準的并發和多線程程式設計深度指南。從std::thread、std::mutex、std::future和std::async等基礎類的使用,到記憶體模型和原子操作、基于鎖和無鎖資料結構的建構,再擴充到并行算法、線程管理,最後還介紹了多線程代碼的測試工作。本書的附錄部分還對c++11新語言特性中與多線程相關的項目進行了簡要的介紹,并提供了c++11線程庫的完整參考。

本書适合于需要深入了解c++多線程開發的讀者,以及使用c++進行各類軟體開發的開發人員、測試人員。對于使用第三方線程庫的讀者,也可以從本書後面的章節中了解到相關的指引和技巧。同時,本書還可以作為c++11線程庫的參考工具書。

第1章 你好,c++的并發世界… 1

1.1 什麼是并發… 1

1.1.1 計算機系統的并發… 1

1.1.2 并發的方法… 3

1.2 為什麼使用并發… 4

1.2.1 因劃分重點而使用并發… 5

1.2.2 為了提高性能而使用并發… 5

1.2.3 什麼時候不使用并發… 6

1.3 在c++中使用并發和多線程… 7

1.3.1 多線程在c++中的發展曆程… 7

1.3.2 新标準對于并發的支援… 8

1.3.3 c++線程庫的效率… 8

1.3.4 平台相關的工具… 9

1.4 開始入門… 9

1.4.1 你好,并發世界… 9

1.5 小結… 10

第2章 線程管理… 13

2.1 基本線程管理… 13

2.1.1 啟動線程… 13

2.1.2 等待線程完成… 16

2.1.3 在異常環境下的等待… 16

2.1.4 背景運作線程… 18

2.2 傳遞參數給線程函數… 19

2.3 轉讓線程的所有權… 21

2.4 在運作時選擇線程數… 24

2.5 辨別線程… 26

2.6 小結… 28

第3章 線上程間共享資料… 29

3.1 線程之間共享資料的問題… 29

3.1.1 競争條件… 31

3.1.2 避免有問題的競争條件… 31

3.2 用互斥元保護共享資料… 32

3.2.1 使用c++中的互斥元… 32

3.2.2 用于保護共享資料的結構化代碼… 33

3.2.3 暴露接口中固有的競争條件… 35

3.2.4 死鎖:問題和解決方案… 41

3.2.5 避免死鎖的進一步指導… 42

3.2.6 使用std::unique_lock靈活鎖定… 47

3.2.7 在作用域之間轉移鎖的所有權… 48

3.2.8 鎖定在适當的粒度… 49

3.3 用于共享資料保護的替代工具… 51

3.3.1 在初始化過程中保護共享資料… 51

3.3.2 保護很少更新的資料結構… 54

3.3.3 遞歸鎖… 56

3.4 小結… 56

第4章 同步并發操作… 59

4.1 等待一個事件或其他條件… 59

4.1.1 使用條件變量的等待條件… 60

4.1.2 使用條件變量建立一個線程安全隊列… 62

4.2 使用future來等待一次性事件… 67

4.2.1 從背景任務中傳回值… 67

4.2.2 将任務與future相關聯… 69

4.2.3 建立(std::)promise. 72

4.2.4 為future儲存異常… 73

4.2.5 來自多個線程的等待… 75

4.3 在時間限制内等待… 77

4.3.1 時鐘… 77

4.3.2 持續時間… 78

4.3.3 時間點… 79

4.3.4 接受逾時的函數… 80

4.4 使用操作同步簡化代碼… 82

4.4.1 帶有future的函數式程式設計… 82

4.4.2 具有消息傳遞的同步操作… 85

4.5 小結… 89

第5章 c++記憶體模型和原子類型上操作… 91

5.1 記憶體模型基礎知識… 91

5.1.1 對象和記憶體位置… 91

5.1.2 對象,記憶體位置以及并發… 92

5.1.3 修改指令… 93

5.2 c++中的原子操作及類型… 93

5.2.1 标準原子類型… 94

5.2.2 std::atomic_flag運算… 96

5.2.3 基于std::atomic<bool>的操作… 97

5.2.4 std::atomic<t*>的操作:指針算術運算… 99

5.2.5 标準原子整數類型的操作… 100

5.2.6 std::atomic<>主要類模闆… 101

5.2.7 原子操作的自由函數… 102

5.3 同步操作和執行排序… 103

5.3.1 synchronizes-with關系… 105

5.3.2 happens-before關系… 106

5.3.3 原子操作的記憶體排序… 107

5.3.4 釋放序列和synchronize-with. 122

5.3.5 栅欄… 124

5.3.6 使用原子來排序非原子操作… 126

5.4 小結… 128

第6章 設計基于鎖的并發資料結構… 129

6.1 為并發性而設計的含義是什麼?… 129

6.1.1 為并發性設計資料結構的準則… 130

6.2 基于鎖的并發資料結構… 131

6.2.1 使用鎖的線程安全棧… 131

6.2.2 使用鎖和條件變量的線程安全隊列… 133

6.2.3 使用細粒度鎖和條件變量的線程安全隊列… 137

6.3 設計更為複雜的基于鎖的資料結構… 148

6.3.1 編寫一個使用鎖的線程安全查找表… 148

6.3.2 編寫一個使用鎖的線程安全連結清單… 153

6.4 小結… 157

第7章 設計無鎖的并發資料結構… 159

7.1 定義和結果… 159

7.1.1 無阻塞資料結構類型… 159

7.1.2 無鎖的資料結構… 160

7.1.3 無等待資料結構… 160

7.1.4 無鎖資料結構的有利和不利方面… 161

7.2 無鎖資料結構的例子… 162

7.2.1 設計不使用鎖的線程安全棧… 162

7.2.2 停止這些讨厭的洩漏:在無鎖資料結構中管理記憶體… 166

7.2.3 用風險指針來檢查哪些結點不能被回收… 170

7.2.4 使用引用計數偵測結點… 177

7.2.5 在無鎖棧上應用記憶體模型… 181

7.2.6 寫一個無鎖的線程安全隊列… 185

7.3 編寫無鎖資料結構的準則… 197

7.3.1 準則:使用std::memory_order_seq_cst做原型設計… 197

7.3.2 準則:使用無鎖記憶體回收利用政策… 197

7.3.3 準則:當心aba問題… 198

7.3.4 準則:識别忙則等待的循環以及幫助别的線程… 198

7.4 小結… 198

第8章 設計并行代碼… 201

8.1 線程間劃分工作的方法… 201

8.1.1 處理開始前線上程間劃分資料… 202

8.1.2 遞歸地劃分資料… 203

8.1.3 通過任務類型劃分資料… 206

8.2 影響并發程式性能的因素… 208

8.2.1 有多少個處理器… 208

8.2.2 資料競争和緩存的乒乓效應… 209

8.2.3 僞共享… 211

8.2.4 資料應該多緊密?… 211

8.2.5 過度訂閱和過多的任務切換… 212

8.3 為多線程性能設計資料結構… 212

8.3.1 為複雜操作劃分數組元素… 212

8.3.2 其它資料結構中的資料讀取方式… 214

8.4 設計并發性時需要考慮的别的方面… 215

8.4.1 并行算法中的異常安全… 215

8.4.2 可擴充性和阿姆達爾定律… 222

8.4.3 用多線程隐藏等待時間… 223

8.4.4 提高并發的響應性… 223

8.5 在實際中設計并發代碼… 225

8.5.1 std::for_each的并行實作… 226

8.5.2 std::find的并行實作… 228

8.5.3 std::partial_sum的并行實作… 232

8.6 總結… 241

第9章 進階線程管理… 243

9.1 線程池… 243

9.1.1 最簡單的線程池實作… 244

9.1.2 等待任務的完成… 246

9.1.3 等待其他任務完成的任務… 249

9.1.4 避免工作隊列的競争… 252

9.1.5 任務偷取… 253

9.2 中斷線程… 258

9.2.1 啟動和中斷另外一個線程… 258

9.2.2 檢測一個線程是否被中斷… 260

9.2.3 中斷一個條件變量等待… 260

9.2.4 中斷一個std::condition_variable_any變量… 263

9.2.5 中斷其他阻塞調用… 265

9.2.6 進行中斷… 266

9.2.7 在應用中中斷背景任務… 266

9.3 總結… 268

第10章 多線程應用的測試和調試… 269

10.1 與并發相關的錯誤類型… 269

10.1.1 不必要的阻塞… 269

10.2 定位并發相關的錯誤的測試和調試技巧… 271

10.2.1 檢閱代碼定位潛在錯誤… 271

10.2.2 通過測試定位并行相關的錯誤… 272

10.2.3 易測性設計… 274

10.2.4 多線程測試技術… 275

10.2.5 建構多線程的測試代碼… 277

10.2.6 測試多線程代碼的性能… 279

10.3 總結… 280

附錄a c++11部分語言特性簡明參考… 281

a.1 右值引用… 281

a.1.1 移動語義… 282

a.1.2 右值引用與函數模版… 284

a.2 deleted函數… 284

a.3 defaulted函數… 286

a.4 constexpr函數… 289

a.4.1 constexpr與使用者定義類型… 290

a.4.2 constexpr對象… 293

a.4.3 constexpr函數要求… 293

a.4.4 constexpr與模闆… 294

a.5 lambda函數… 294

a.5.1 引用局部變量的lambda函數… 296

a.6 可變參數模闆… 298

a.6.1 展開參數包… 299

a.7 自動推斷變量的類型… 301

a.8 線程局部變量… 302

a.9 小結… 303

附錄b 并發類庫簡要對比… 305

附錄c 消息傳遞架構與完整的atm示例… 307

附錄d c++線程類庫參考… 326

d.1 <chrono>頭檔案… 326

d.1.1 std::chrono::duration類模闆… 326

d.1.2 std::chrono::time_point類模闆… 336

d.1.3 std::chrono::system_clock類… 339

d.1.4 std::chrono::steady_clock類… 341

d.1.5 std::chrono::high_resolution_clock typedef 342

d.2 <condition_variable>頭檔案… 343

d.2.1 std::condition_variable類… 343

d.2.2 std::condition_variable_any類… 351

d.3 <atomic>頭檔案… 359

d.3.1 std::atomic_xxx typedef 361

d.3.2 atomic_xxx_lock_free宏… 361

d.3.3 atomic_var_init宏… 362

d.3.4 std::memory_order枚舉… 362

d.3.5 std::atomic_thread_fence函數… 363

d.3.6 std::atomic_signal_fence函數… 363

d.3.7 std::atomic_flag類… 364

d.3.8 std::atomic類模闆… 367

d.3.9 std::atomic模闆的特化… 378

d.3.10 std::atomic<integral-type>特化… 379

d.3.11 std::atomic<t*>偏特化… 392

d.4 <future>頭檔案… 398

d.4.1 std::future類模闆… 399

d.4.2 std::shared_future類模闆… 405

d.4.3 std::packaged_task類模闆… 410

d.4.4 std::promise類模闆… 416

d.4.5 std::async函數模闆… 422

d.5 <mutex>頭檔案… 423

d.5.1 std::mutex類… 424

d.5.2 std::recursive_mutex類… 426

d.5.3 std::timed_mutex類… 429

d.5.4 std::recursive_timed_mutex類… 433

d.5.5 std::lock_guard類模闆… 438

d.5.6 std::unique_lock類模闆… 439

d.5.7 std::lock函數模闆… 450

d.5.8 std::try_lock函數模闆… 450

d.5.9 std::once_flag類… 451

d.5.10 std::call_once函數模闆… 451

d.6 <ratio>頭檔案… 452

d.6.1 std::ratio類模闆… 453

d.6.2 std::ratio_add模闆别名… 454

d.6.3 std::ratio_subtract模闆别名… 455

d.6.4 std::ratio_multiply模闆别名… 455

d.6.5 std::ratio_divide模闆别名… 456

d.6.6 std::ratio_equal類模闆… 456

d.6.7 std::ratio_not_equal類模闆… 457

d.6.8 std::ratio_less類模闆… 457

d.6.9 std::ratio_greater類模闆… 458

d.6.10 std::ratio_less_equal類模闆… 458

d.6.11 std::ratio_greater_equal類模闆… 459

d.7 <thread>頭檔案… 459

d.7.1 std::thread類… 459

d.7.2 this_thread命名空間… 469

資源… 471

印刷資源… 471

線上資源… 471

周全,軟體工程師,畢業于中國科學技術大學資訊學院,現任職于中國人民銀行合肥中心支行科技處。從事.net開發多年,有較為豐富的系統內建和運維經驗,對虛拟化也有較深入的研究。可以通過email: [email protected]與他聯系。

宋真真,網絡工程師,2008年畢業于合肥工業大學計算機與資訊學院,現任職于中國人民銀行合肥中心支行科技處,參與軟體開發、項目管理等工作,愛好資料庫、程式設計等研究。可以通過email: [email protected]與她聯系。

梁娟娟,2010年畢業于中國科學技術大學資訊技術學院,現就職于中國人民銀行合肥中心支行。

 許敏,軟體工程師,2005年獲得軟體測試工程師證書。現任職于中國人民銀行合肥中心支行科技處,負責項目管理工作。可以通過email: [email protected]與她聯系。

繼續閱讀