注冊(cè) | 登錄讀書(shū)好,好讀書(shū),讀好書(shū)!
讀書(shū)網(wǎng)-DuShu.com
當(dāng)前位置: 首頁(yè)出版圖書(shū)科學(xué)技術(shù)計(jì)算機(jī)/網(wǎng)絡(luò)軟件與程序設(shè)計(jì)C++并發(fā)編程實(shí)戰(zhàn)(第2版)

C++并發(fā)編程實(shí)戰(zhàn)(第2版)

C++并發(fā)編程實(shí)戰(zhàn)(第2版)

定 價(jià):¥139.80

作 者: [英] 安東尼·威廉姆斯(Anthony Williams) 著,吳天明 譯
出版社: 人民郵電出版社
叢編項(xiàng):
標(biāo) 簽: 暫缺

購(gòu)買(mǎi)這本書(shū)可以去


ISBN: 9787115573551 出版時(shí)間: 2021-12-01 包裝: 平裝
開(kāi)本: 16開(kāi) 頁(yè)數(shù): 409 字?jǐn)?shù):  

內(nèi)容簡(jiǎn)介

  這是一本介紹C++并發(fā)和多線程編程的深度指南。本書(shū)從C++標(biāo)準(zhǔn)程序庫(kù)的各種工具講起,介紹線程管控、在線程間共享數(shù)據(jù)、并發(fā)操作的同步、C++內(nèi)存模型和原子操作等內(nèi)容。同時(shí),本書(shū)還介紹基于鎖的并發(fā)數(shù)據(jù)結(jié)構(gòu)、無(wú)鎖數(shù)據(jù)結(jié)構(gòu)、并發(fā)代碼,以及高級(jí)線程管理、并行算法函數(shù)、多線程應(yīng)用的測(cè)試和除錯(cuò)。本書(shū)還通過(guò)附錄及線上資源提供豐富的補(bǔ)充資料,以幫助讀者更完整、細(xì)致地掌握C++并發(fā)編程的知識(shí)脈絡(luò)。本書(shū)適合需要深入了解C++多線程開(kāi)發(fā)的讀者,以及使用C++進(jìn)行各類軟件開(kāi)發(fā)的開(kāi)發(fā)人員、測(cè)試人員,還可以作為C++線程庫(kù)的參考工具書(shū)。

作者簡(jiǎn)介

  安東尼·威廉姆斯(Anthony Williams),C++開(kāi)發(fā)人員、顧問(wèn)、培訓(xùn)師,英國(guó)標(biāo)準(zhǔn)協(xié)會(huì)C++標(biāo)準(zhǔn)組成員,擁有超過(guò)20年的C++開(kāi)發(fā)經(jīng)驗(yàn),獨(dú)立編寫(xiě)或合著了眾多C++標(biāo)準(zhǔn)委員會(huì)文件,為C++11標(biāo)準(zhǔn)引入了線程庫(kù),實(shí)現(xiàn)了工具“just::thread Pro”(Just Software Solutions公司的產(chǎn)品),并持續(xù)致力于開(kāi)發(fā)C++的新特性,以增強(qiáng)C++并發(fā)工具集的功能,這兩者都遵循C++標(biāo)準(zhǔn)和提案。

圖書(shū)目錄

第 1章 你好,C++并發(fā)世界 1
1.1 什么是并發(fā) 2
1.1.1 計(jì)算機(jī)系統(tǒng)中的并發(fā) 2
1.1.2 并發(fā)的方式 4
1.1.3 并發(fā)與并行 5
1.2 為什么使用并發(fā)技術(shù) 6
1.2.1 為分離關(guān)注點(diǎn)而并發(fā) 6
1.2.2 為性能而并發(fā):任務(wù)并行和數(shù)據(jù)并行 7
1.2.3 什么時(shí)候避免并發(fā) 8
1.3 并發(fā)與C++多線程 9
1.3.1 C++多線程簡(jiǎn)史 9
1.3.2 新標(biāo)準(zhǔn)對(duì)并發(fā)的支持 10
1.3.3 C++14和C++17進(jìn)一步
支持并發(fā)和并行 10
1.3.4 標(biāo)準(zhǔn)C++線程庫(kù)的效率 10
1.3.5 平臺(tái)專屬的工具 12
1.4 啟程上路 12
實(shí)例—“Hello Concurrent World” 12
1.5 小結(jié) 13
第 2章 線程管控 15
2.1 線程的基本管控 15
2.1.1 發(fā)起線程 16
2.1.2 等待線程完成 19
2.1.3 在出現(xiàn)異常的情況下等待 19
2.1.4 在后臺(tái)運(yùn)行線程 21
2.2 向線程函數(shù)傳遞參數(shù) 23
2.3 移交線程歸屬權(quán) 26
2.4 在運(yùn)行時(shí)選擇線程數(shù)量 30
2.5 識(shí)別線程 33
2.6 小結(jié) 35
第3章 在線程間共享數(shù)據(jù) 37
3.1 線程間共享數(shù)據(jù)的問(wèn)題 38
3.1.1 條件競(jìng)爭(zhēng) 39
3.1.2 防止惡性條件競(jìng)爭(zhēng) 40
3.2 用互斥保護(hù)共享數(shù)據(jù) 41
3.2.1 在C++中使用互斥 41
3.2.2 組織和編排代碼以保護(hù)共享數(shù)據(jù) 43
3.2.3 發(fā)現(xiàn)接口固有的條件競(jìng)爭(zhēng) 44
3.2.4 死鎖:?jiǎn)栴}和解決方法 51
3.2.5 防范死鎖的補(bǔ)充準(zhǔn)則 53
3.2.6 運(yùn)用std::unique_lock<>靈活加鎖 60
3.2.7 在不同作用域之間轉(zhuǎn)移互斥歸屬權(quán) 61
3.2.8 按適合的粒度加鎖 62
3.3 保護(hù)共享數(shù)據(jù)的其他工具 64
3.3.1 在初始化過(guò)程中保護(hù)共享數(shù)據(jù) 65
3.3.2 保護(hù)甚少更新的數(shù)據(jù)結(jié)構(gòu) 68
3.3.3 遞歸加鎖 70
3.4 小結(jié) 71
第4章 并發(fā)操作的同步 73
4.1 等待事件或等待其他條件 73
4.1.1 憑借條件變量等待條件成立 75
4.1.2 利用條件變量構(gòu)建線程安全的隊(duì)列 77
4.2 使用future等待一次性事件發(fā)生 82
4.2.1 從后臺(tái)任務(wù)返回值 83
4.2.2 關(guān)聯(lián)future實(shí)例和任務(wù) 85
4.2.3 創(chuàng)建std::promise 88
4.2.4 將異常保存到future中 90
4.2.5 多個(gè)線程一起等待 91
4.3 限時(shí)等待 94
4.3.1 時(shí)鐘類 94
4.3.2 時(shí)長(zhǎng)類 95
4.3.3 時(shí)間點(diǎn)類 97
4.3.4 接受超時(shí)時(shí)限的函數(shù) 99
4.4 運(yùn)用同步操作簡(jiǎn)化代碼 101
4.4.1 利用future進(jìn)行函數(shù)式編程 101
4.4.2 使用消息傳遞進(jìn)行同步 106
4.4.3 符合并發(fā)技術(shù)規(guī)約的后續(xù)風(fēng)格并發(fā) 110
4.4.4 后續(xù)函數(shù)的連鎖調(diào)用 112
4.4.5 等待多個(gè)future 115
4.4.6 運(yùn)用std::experimental::when_any()函數(shù)等待多個(gè)
future,直到其中之一準(zhǔn)備就緒 117
4.4.7 線程閂和線程卡——并發(fā)技術(shù)規(guī)約提出的新特性 120
4.4.8 基本的線程閂類std::experimental::latch 121
4.4.9 基本的線程卡類std::experimental::barrier 122
4.4.10 std::experimental::flex_barrier——std::experimental::barrier的靈活版本 124
4.5 小結(jié) 125
第5章 C++內(nèi)存模型和原子操作 127
5.1 內(nèi)存模型基礎(chǔ) 128
5.1.1 對(duì)象和內(nèi)存區(qū)域 128
5.1.2 對(duì)象、內(nèi)存區(qū)域和并發(fā) 129
5.1.3 改動(dòng)序列 130
5.2 C++中的原子操作及其類別 131
5.2.1 標(biāo)準(zhǔn)原子類型 131
5.2.2 操作std::atomic_flag 135
5.2.3 操作std::atomic 137
5.2.4 操作std::atomic:算術(shù)形式的指針運(yùn)算 139
5.2.5 操作標(biāo)準(zhǔn)整數(shù)原子類型 140
5.2.6 泛化的std::atomic<>類模板 141
5.2.7 原子操作的非成員函數(shù) 143
5.3 同步操作和強(qiáng)制次序 145
5.3.1 同步關(guān)系 147
5.3.2 先行關(guān)系 147
5.3.3 原子操作的內(nèi)存次序 149
5.3.4 釋放序列和同步關(guān)系 167
5.3.5 柵欄 169
5.3.6 憑借原子操作令非原子操作服從內(nèi)存次序 171
5.3.7 強(qiáng)制非原子操作服從內(nèi)存次序 172
5.4 小結(jié) 175
第6章 設(shè)計(jì)基于鎖的并發(fā)數(shù)據(jù)結(jié)構(gòu) 177
6.1 并發(fā)設(shè)計(jì)的內(nèi)涵 178
6.2 基于鎖的并發(fā)數(shù)據(jù)結(jié)構(gòu) 179
6.2.1 采用鎖實(shí)現(xiàn)線程安全的棧容器 180
6.2.2 采用鎖和條件變量實(shí)現(xiàn)線程安全的隊(duì)列容器 182
6.2.3 采用精細(xì)粒度的鎖和條件變量實(shí)現(xiàn)線程安全的隊(duì)列容器 186
6.3 設(shè)計(jì)更復(fù)雜的基于鎖的并發(fā)數(shù)據(jù)結(jié)構(gòu) 198
6.3.1 采用鎖編寫(xiě)線程安全的查找表 198
6.3.2 采用多種鎖編寫(xiě)線程安全的鏈表 204
6.4 小結(jié) 208
第7章 設(shè)計(jì)無(wú)鎖數(shù)據(jù)結(jié)構(gòu) 209
7.1 定義和推論 210
7.1.1 非阻塞型數(shù)據(jù)結(jié)構(gòu) 210
7.1.2 無(wú)鎖數(shù)據(jù)結(jié)構(gòu) 211
7.1.3 無(wú)須等待的數(shù)據(jù)結(jié)構(gòu) 212
7.1.4 無(wú)鎖數(shù)據(jù)結(jié)構(gòu)的優(yōu)點(diǎn)和缺點(diǎn) 212
7.2 無(wú)鎖數(shù)據(jù)結(jié)構(gòu)范例 213
7.2.1 實(shí)現(xiàn)線程安全的無(wú)鎖?!?14
7.2.2 制止麻煩的內(nèi)存泄漏:在無(wú)鎖數(shù)據(jù)結(jié)構(gòu)中管理內(nèi)存 217
7.2.3 運(yùn)用風(fēng)險(xiǎn)指針檢測(cè)無(wú)法回收的節(jié)點(diǎn) 223
7.2.4 借引用計(jì)數(shù)檢測(cè)正在使用中的節(jié)點(diǎn) 231
7.2.5 為無(wú)鎖棧容器施加內(nèi)存模型 237
7.2.6 實(shí)現(xiàn)線程安全的無(wú)鎖隊(duì)列 242
7.3 實(shí)現(xiàn)無(wú)鎖數(shù)據(jù)結(jié)構(gòu)的原則 254
7.3.1 原則1:在原型設(shè)計(jì)中使用std::memory_order_seq_cst次序 254
7.3.2 原則2:使用無(wú)鎖的內(nèi)存回收方案 255
7.3.3 原則3:防范ABA問(wèn)題 255
7.3.4 原則4:找出忙等循環(huán),協(xié)助其他線程 256
7.4 小結(jié) 256
第8章 設(shè)計(jì)并發(fā)代碼 257
8.1 在線程間切分任務(wù)的方法 258
8.1.1 先在線程間切分?jǐn)?shù)據(jù),再開(kāi)始處理 258
8.1.2 以遞歸方式劃分?jǐn)?shù)據(jù) 259
8.1.3 依據(jù)工作類別劃分任務(wù) 263
8.2 影響并發(fā)代碼性能的因素 266
8.2.1 處理器的數(shù)量 266
8.2.2 數(shù)據(jù)競(jìng)爭(zhēng)和緩存乒乓(cache ping-pong) 267
8.2.3 不經(jīng)意共享 270
8.2.4 數(shù)據(jù)的緊湊程度 270
8.2.5 過(guò)度任務(wù)切換與線程過(guò)飽和 271
8.3 設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)以提升多線程程序的性能 272
8.3.1 針對(duì)復(fù)雜操作的數(shù)據(jù)劃分 272
8.3.2 其他數(shù)據(jù)結(jié)構(gòu)的訪問(wèn)模式 275
8.4 設(shè)計(jì)并發(fā)代碼時(shí)要額外考慮的因素 276
8.4.1 并行算法代碼中的異常安全 276
8.4.2 可伸縮性和Amdahl定律 283
8.4.3 利用多線程“掩藏”等待行為 285
8.4.4 借并發(fā)特性改進(jìn)響應(yīng)能力 286
8.5 并發(fā)代碼的設(shè)計(jì)實(shí)踐 287
8.5.1 std::for_each()的并行實(shí)現(xiàn) 288
8.5.2 std::find()的并行實(shí)現(xiàn) 290
8.5.3 std::partial_sum()的并行實(shí)現(xiàn) 295
8.6 小結(jié) 305
第9章 高級(jí)線程管理 307
9.1 線程池 308
9.1.1 最簡(jiǎn)易可行的線程池 308
9.1.2 等待提交給線程池的任務(wù)完成運(yùn)行 310
9.1.3 等待其他任務(wù)完成的任務(wù) 313
9.1.4 避免任務(wù)隊(duì)列上的爭(zhēng)奪 316
9.1.5 任務(wù)竊取 318
9.2 中斷線程 322
9.2.1 發(fā)起一個(gè)線程,以及把它中斷 323
9.2.2 檢測(cè)線程是否被中斷 324
9.2.3 中斷條件變量上的等待 325
9.2.4 中斷條件變量std::condition_variable_any上的等待 328
9.2.5 中斷其他阻塞型等待 330
9.2.6 處理中斷 331
9.2.7 在應(yīng)用程序退出時(shí)中斷后臺(tái)任務(wù) 332
9.3 小結(jié) 333
第 10章 并行算法函數(shù) 335
10.1 并行化的標(biāo)準(zhǔn)庫(kù)算法函數(shù) 335
10.2 執(zhí)行策略 336
10.2.1 因指定執(zhí)行策略而普遍產(chǎn)生的作用 336
10.2.2 std::execution::sequenced_policy 337
10.2.3 std::execution::parallel_policy 338
10.2.4 std::execution::parallel_unsequenced_policy 339
10.3 C++標(biāo)準(zhǔn)庫(kù)的并行算法函數(shù) 339
10.3.1 并行算法函數(shù)的使用范例 342
10.3.2 訪問(wèn)計(jì)數(shù) 344
10.4 小結(jié) 346
第 11章 多線程應(yīng)用的測(cè)試和除錯(cuò) 347
11.1 與并發(fā)相關(guān)的錯(cuò)誤類型 347
11.1.1 多余的阻塞 348
11.1.2 條件競(jìng)爭(zhēng) 348
11.2 定位并發(fā)相關(guān)的錯(cuò)誤的技法 349
11.2.1 審查代碼并定位潛在錯(cuò)誤 350
11.2.2 通過(guò)測(cè)試定位與并發(fā)相關(guān)的錯(cuò)誤 352
11.2.3 設(shè)計(jì)可測(cè)試的代碼 353
11.2.4 多線程測(cè)試技術(shù) 355
11.2.5 以特定結(jié)構(gòu)組織多線程的測(cè)試代碼 357
11.2.6 測(cè)試多線程代碼的性能 360
11.3 小結(jié)360
附錄A C++11精要:部分語(yǔ)言特性 361
A.1 右值引用 361
A.1.1 移動(dòng)語(yǔ)義 362
A.1.2 右值引用和函數(shù)模板 365
A.2 刪除函數(shù) 366
A.3 默認(rèn)函數(shù) 368
A.4 常量表達(dá)式函數(shù) 371
A.4.1 constexpr關(guān)鍵字和用戶定義型別 373
A.4.2 constexpr對(duì)象 376
A.4.3 constexpr函數(shù)要符合的條件 376
A.4.4 constexpr與模板 377
A.5 lambda函數(shù) 377
A.6 變參模板 382
A.7 自動(dòng)推導(dǎo)變量的型別 386
A.8 線程局部變量 387
A.9 類模板的參數(shù)推導(dǎo) 389
A.10 小結(jié) 389
附錄B 各并發(fā)程序庫(kù)的簡(jiǎn)要
對(duì)比 391
附錄C 消息傳遞程序庫(kù)和完整
的自動(dòng)柜員機(jī)范例 393

本目錄推薦

掃描二維碼
Copyright ? 讀書(shū)網(wǎng) www.shuitoufair.cn 2005-2020, All Rights Reserved.
鄂ICP備15019699號(hào) 鄂公網(wǎng)安備 42010302001612號(hào)