舉報

會員
C++并發編程實戰(第2版)
最新章節:
附錄D C++11線程庫參考名錄
這是一本介紹C++并發和多線程編程的深度指南。本書從C++標準程序庫的各種工具講起,介紹線程管控、在線程間共享數據、并發操作的同步、C++內存模型和原子操作等內容。同時,本書還介紹基于鎖的并發數據結構、無鎖數據結構、并發代碼,以及高級線程管理、并行算法函數、多線程應用的測試和除錯。本書還通過附錄及線上資源提供豐富的補充資料,以幫助讀者更完整、細致地掌握C++并發編程的知識脈絡。本書適合需要深入了解C++多線程開發的讀者,以及使用C++進行各類軟件開發的開發人員、測試人員,還可以作為C++線程庫的參考工具書。
最新章節
- 附錄D C++11線程庫參考名錄
- 附錄C 消息傳遞程序庫和完整的自動柜員機范例
- 附錄B 各并發程序庫的簡要對比
- 附錄A C++11精要:部分語言特性
- 11.3 小結
- 11.2.6 測試多線程代碼的性能
品牌:人郵圖書
譯者:吳天明
上架時間:2022-01-04 16:30:43
出版社:人民郵電出版社
本書數字版權由人郵圖書提供,并由其授權上海閱文信息技術有限公司制作發行
- 附錄D C++11線程庫參考名錄 更新時間:2022-01-04 16:36:37
- 附錄C 消息傳遞程序庫和完整的自動柜員機范例
- 附錄B 各并發程序庫的簡要對比
- 附錄A C++11精要:部分語言特性
- 11.3 小結
- 11.2.6 測試多線程代碼的性能
- 11.2.5 以特定結構組織多線程的測試代碼
- 11.2.4 多線程測試技術
- 11.2.3 設計可測試的代碼
- 11.2.2 通過測試定位與并發相關的錯誤
- 11.2.1 審查代碼并定位潛在錯誤
- 11.2 定位并發相關的錯誤的技法
- 11.1.2 條件競爭
- 11.1.1 多余的阻塞
- 11.1 與并發相關的錯誤類型
- 第11章 多線程應用的測試和除錯
- 10.4 小結
- 10.3.2 訪問計數
- 10.3.1 并行算法函數的使用范例
- 10.3 C++標準庫的并行算法函數
- 10.2.4 std::execution::parallel_unsequenced_policy
- 10.2.3 std::execution::parallel_policy
- 10.2.2 std::execution::sequenced_policy
- 10.2.1 因指定執行策略而普遍產生的作用
- 10.2 執行策略
- 10.1 并行化的標準庫算法函數
- 第10章 并行算法函數
- 9.3 小結
- 9.2.7 在應用程序退出時中斷后臺任務
- 9.2.6 處理中斷
- 9.2.5 中斷其他阻塞型等待
- 9.2.4 中斷條件變量std::condition_variable_any上的等待
- 9.2.3 中斷條件變量上的等待
- 9.2.2 檢測線程是否被中斷
- 9.2.1 發起一個線程,以及把它中斷
- 9.2 中斷線程
- 9.1.5 任務竊取
- 9.1.4 避免任務隊列上的爭奪
- 9.1.3 等待其他任務完成的任務
- 9.1.2 等待提交給線程池的任務完成運行
- 9.1.1 最簡易可行的線程池
- 9.1 線程池
- 第9章 高級線程管理
- 8.6 小結
- 8.5.3 std::partial_sum()的并行實現
- 8.5.2 std::find()的并行實現
- 8.5.1 std::for_each()的并行實現
- 8.5 并發代碼的設計實踐
- 8.4.4 借并發特性改進響應能力
- 8.4.3 利用多線程“掩藏”等待行為
- 8.4.2 可伸縮性和Amdahl定律
- 8.4.1 并行算法代碼中的異常安全
- 8.4 設計并發代碼時要額外考慮的因素
- 8.3.2 其他數據結構的訪問模式
- 8.3.1 針對復雜操作的數據劃分
- 8.3 設計數據結構以提升多線程程序的性能
- 8.2.5 過度任務切換與線程過飽和
- 8.2.4 數據的緊湊程度
- 8.2.3 不經意共享
- 8.2.2 數據競爭和緩存乒乓(cache ping-pong)[4]
- 8.2.1 處理器的數量
- 8.2 影響并發代碼性能的因素
- 8.1.3 依據工作類別劃分任務
- 8.1.2 以遞歸方式劃分數據
- 8.1.1 先在線程間切分數據,再開始處理
- 8.1 在線程間切分任務的方法
- 第8章 設計并發代碼
- 7.4 小結
- 7.3.4 原則4:找出忙等循環,協助其他線程
- 7.3.3 原則3:防范ABA問題
- 7.3.2 原則2:使用無鎖的內存回收方案
- 7.3.1 原則1:在原型設計中使用std::memory_order_seq_cst次序
- 7.3 實現無鎖數據結構的原則
- 7.2.6 實現線程安全的無鎖隊列
- 7.2.5 為無鎖棧容器施加內存模型
- 7.2.4 借引用計數檢測正在使用中的節點
- 7.2.3 運用風險指針檢測無法回收的節點
- 7.2.2 制止麻煩的內存泄漏:在無鎖數據結構中管理內存
- 7.2.1 實現線程安全的無鎖棧[2]
- 7.2 無鎖數據結構范例
- 7.1.4 無鎖數據結構的優點和缺點
- 7.1.3 無須等待的數據結構
- 7.1.2 無鎖數據結構
- 7.1.1 非阻塞型數據結構
- 7.1 定義和推論
- 第7章 設計無鎖數據結構
- 6.4 小結
- 6.3.2 采用多種鎖編寫線程安全的鏈表
- 6.3.1 采用鎖編寫線程安全的查找表
- 6.3 設計更復雜的基于鎖的并發數據結構
- 6.2.3 采用精細粒度的鎖和條件變量實現線程安全的隊列容器
- 6.2.2 采用鎖和條件變量實現線程安全的隊列容器
- 6.2.1 采用鎖實現線程安全的棧容器
- 6.2 基于鎖的并發數據結構
- 設計并發數據結構的指引
- 6.1 并發設計的內涵
- 第6章 設計基于鎖的并發數據結構
- 5.4 小結
- 5.3.7 強制非原子操作服從內存次序
- 5.3.6 憑借原子操作令非原子操作服從內存次序
- 5.3.5 柵欄
- 5.3.4 釋放序列和同步關系
- 5.3.3 原子操作的內存次序
- 5.3.2 先行關系
- 5.3.1 同步關系
- 5.3 同步操作和強制次序
- 5.2.7 原子操作的非成員函數[11]
- 5.2.6 泛化的std::atomic<>類模板
- 5.2.5 操作標準整數原子類型
- 5.2.4 操作std::atomic<T*>:算術形式的指針運算
- 5.2.3 操作std::atomic<bool>
- 5.2.2 操作std::atomic_flag
- 5.2.1 標準原子類型
- 5.2 C++中的原子操作及其類別
- 5.1.3 改動序列
- 5.1.2 對象、內存區域和并發
- 5.1.1 對象和內存區域
- 5.1 內存模型基礎
- 第5章 C++內存模型和原子操作
- 4.5 小結
- 4.4.10 std::experimental::flex_barrier——std::experimental::barrier的靈活版本
- 4.4.9 基本的線程卡類std::experimental::barrier
- 4.4.8 基本的線程閂類std::experimental::latch
- 4.4.7 線程閂和線程卡——并發技術規約提出的新特性
- 4.4.6 運用std::experimental::when_any()函數等待多個future,直到其中之一準備就緒
- 4.4.5 等待多個future
- 4.4.4 后續函數的連鎖調用
- 4.4.3 符合并發技術規約的后續風格并發[30]
- 4.4.2 使用消息傳遞進行同步
- 4.4.1 利用future進行函數式編程
- 4.4 運用同步操作簡化代碼
- 4.3.4 接受超時時限的函數
- 4.3.3 時間點類
- 4.3.2 時長類
- 4.3.1 時鐘類
- 4.3 限時等待
- 4.2.5 多個線程一起等待
- 4.2.4 將異常保存到future中
- 4.2.3 創建std::promise
- 4.2.2 關聯future實例和任務
- 4.2.1 從后臺任務返回值
- 4.2 使用future等待一次性事件發生
- 4.1.2 利用條件變量構建線程安全的隊列
- 4.1.1 憑借條件變量等待條件成立
- 4.1 等待事件或等待其他條件
- 第4章 并發操作的同步
- 3.4 小結
- 3.3.3 遞歸加鎖
- 3.3.2 保護甚少更新的數據結構
- 3.3.1 在初始化過程中保護共享數據
- 3.3 保護共享數據的其他工具
- 3.2.8 按適合的粒度加鎖
- 3.2.7 在不同作用域之間轉移互斥歸屬權
- 3.2.6 運用std::unique_lock<>靈活加鎖
- 3.2.5 防范死鎖的補充準則
- 3.2.4 死鎖:問題和解決方法
- 3.2.3 發現接口固有的條件競爭
- 3.2.2 組織和編排代碼以保護共享數據
- 3.2.1 在C++中使用互斥
- 3.2 用互斥保護共享數據
- 3.1.2 防止惡性條件競爭
- 3.1.1 條件競爭
- 3.1 線程間共享數據的問題
- 第3章 在線程間共享數據
- 2.6 小結
- 2.5 識別線程
- 2.4 在運行時選擇線程數量
- 2.3 移交線程歸屬權
- 2.2 向線程函數傳遞參數
- 2.1.4 在后臺運行線程
- 2.1.3 在出現異常的情況下等待
- 2.1.2 等待線程完成
- 2.1.1 發起線程
- 2.1 線程的基本管控
- 第2章 線程管控
- 1.5 小結
- 實例——“Hello Concurrent World”
- 1.4 啟程上路
- 1.3.5 平臺專屬的工具
- 1.3.4 標準C++線程庫的效率
- 1.3.3 C++14和C++17進一步支持并發和并行
- 1.3.2 新標準對并發的支持
- 1.3.1 C++多線程簡史
- 1.3 并發與C++多線程
- 1.2.3 什么時候避免并發
- 1.2.2 為性能而并發:任務并行和數據并行
- 1.2.1 為分離關注點而并發
- 1.2 為什么使用并發技術
- 1.1.3 并發與并行
- 1.1.2 并發的方式
- 1.1.1 計算機系統中的并發
- 1.1 什么是并發
- 第1章 你好,C++并發世界
- 資源與支持
- 關于本書
- 譯者致謝
- 譯者序
- 作者致謝
- 作者序
- 本書第1版贏得的贊譽
- 作者簡介
- 內容提要
- 版權聲明
- 版 權
- 版權信息
- 封面
- 封面
- 版權信息
- 版 權
- 版權聲明
- 內容提要
- 作者簡介
- 本書第1版贏得的贊譽
- 作者序
- 作者致謝
- 譯者序
- 譯者致謝
- 關于本書
- 資源與支持
- 第1章 你好,C++并發世界
- 1.1 什么是并發
- 1.1.1 計算機系統中的并發
- 1.1.2 并發的方式
- 1.1.3 并發與并行
- 1.2 為什么使用并發技術
- 1.2.1 為分離關注點而并發
- 1.2.2 為性能而并發:任務并行和數據并行
- 1.2.3 什么時候避免并發
- 1.3 并發與C++多線程
- 1.3.1 C++多線程簡史
- 1.3.2 新標準對并發的支持
- 1.3.3 C++14和C++17進一步支持并發和并行
- 1.3.4 標準C++線程庫的效率
- 1.3.5 平臺專屬的工具
- 1.4 啟程上路
- 實例——“Hello Concurrent World”
- 1.5 小結
- 第2章 線程管控
- 2.1 線程的基本管控
- 2.1.1 發起線程
- 2.1.2 等待線程完成
- 2.1.3 在出現異常的情況下等待
- 2.1.4 在后臺運行線程
- 2.2 向線程函數傳遞參數
- 2.3 移交線程歸屬權
- 2.4 在運行時選擇線程數量
- 2.5 識別線程
- 2.6 小結
- 第3章 在線程間共享數據
- 3.1 線程間共享數據的問題
- 3.1.1 條件競爭
- 3.1.2 防止惡性條件競爭
- 3.2 用互斥保護共享數據
- 3.2.1 在C++中使用互斥
- 3.2.2 組織和編排代碼以保護共享數據
- 3.2.3 發現接口固有的條件競爭
- 3.2.4 死鎖:問題和解決方法
- 3.2.5 防范死鎖的補充準則
- 3.2.6 運用std::unique_lock<>靈活加鎖
- 3.2.7 在不同作用域之間轉移互斥歸屬權
- 3.2.8 按適合的粒度加鎖
- 3.3 保護共享數據的其他工具
- 3.3.1 在初始化過程中保護共享數據
- 3.3.2 保護甚少更新的數據結構
- 3.3.3 遞歸加鎖
- 3.4 小結
- 第4章 并發操作的同步
- 4.1 等待事件或等待其他條件
- 4.1.1 憑借條件變量等待條件成立
- 4.1.2 利用條件變量構建線程安全的隊列
- 4.2 使用future等待一次性事件發生
- 4.2.1 從后臺任務返回值
- 4.2.2 關聯future實例和任務
- 4.2.3 創建std::promise
- 4.2.4 將異常保存到future中
- 4.2.5 多個線程一起等待
- 4.3 限時等待
- 4.3.1 時鐘類
- 4.3.2 時長類
- 4.3.3 時間點類
- 4.3.4 接受超時時限的函數
- 4.4 運用同步操作簡化代碼
- 4.4.1 利用future進行函數式編程
- 4.4.2 使用消息傳遞進行同步
- 4.4.3 符合并發技術規約的后續風格并發[30]
- 4.4.4 后續函數的連鎖調用
- 4.4.5 等待多個future
- 4.4.6 運用std::experimental::when_any()函數等待多個future,直到其中之一準備就緒
- 4.4.7 線程閂和線程卡——并發技術規約提出的新特性
- 4.4.8 基本的線程閂類std::experimental::latch
- 4.4.9 基本的線程卡類std::experimental::barrier
- 4.4.10 std::experimental::flex_barrier——std::experimental::barrier的靈活版本
- 4.5 小結
- 第5章 C++內存模型和原子操作
- 5.1 內存模型基礎
- 5.1.1 對象和內存區域
- 5.1.2 對象、內存區域和并發
- 5.1.3 改動序列
- 5.2 C++中的原子操作及其類別
- 5.2.1 標準原子類型
- 5.2.2 操作std::atomic_flag
- 5.2.3 操作std::atomic<bool>
- 5.2.4 操作std::atomic<T*>:算術形式的指針運算
- 5.2.5 操作標準整數原子類型
- 5.2.6 泛化的std::atomic<>類模板
- 5.2.7 原子操作的非成員函數[11]
- 5.3 同步操作和強制次序
- 5.3.1 同步關系
- 5.3.2 先行關系
- 5.3.3 原子操作的內存次序
- 5.3.4 釋放序列和同步關系
- 5.3.5 柵欄
- 5.3.6 憑借原子操作令非原子操作服從內存次序
- 5.3.7 強制非原子操作服從內存次序
- 5.4 小結
- 第6章 設計基于鎖的并發數據結構
- 6.1 并發設計的內涵
- 設計并發數據結構的指引
- 6.2 基于鎖的并發數據結構
- 6.2.1 采用鎖實現線程安全的棧容器
- 6.2.2 采用鎖和條件變量實現線程安全的隊列容器
- 6.2.3 采用精細粒度的鎖和條件變量實現線程安全的隊列容器
- 6.3 設計更復雜的基于鎖的并發數據結構
- 6.3.1 采用鎖編寫線程安全的查找表
- 6.3.2 采用多種鎖編寫線程安全的鏈表
- 6.4 小結
- 第7章 設計無鎖數據結構
- 7.1 定義和推論
- 7.1.1 非阻塞型數據結構
- 7.1.2 無鎖數據結構
- 7.1.3 無須等待的數據結構
- 7.1.4 無鎖數據結構的優點和缺點
- 7.2 無鎖數據結構范例
- 7.2.1 實現線程安全的無鎖棧[2]
- 7.2.2 制止麻煩的內存泄漏:在無鎖數據結構中管理內存
- 7.2.3 運用風險指針檢測無法回收的節點
- 7.2.4 借引用計數檢測正在使用中的節點
- 7.2.5 為無鎖棧容器施加內存模型
- 7.2.6 實現線程安全的無鎖隊列
- 7.3 實現無鎖數據結構的原則
- 7.3.1 原則1:在原型設計中使用std::memory_order_seq_cst次序
- 7.3.2 原則2:使用無鎖的內存回收方案
- 7.3.3 原則3:防范ABA問題
- 7.3.4 原則4:找出忙等循環,協助其他線程
- 7.4 小結
- 第8章 設計并發代碼
- 8.1 在線程間切分任務的方法
- 8.1.1 先在線程間切分數據,再開始處理
- 8.1.2 以遞歸方式劃分數據
- 8.1.3 依據工作類別劃分任務
- 8.2 影響并發代碼性能的因素
- 8.2.1 處理器的數量
- 8.2.2 數據競爭和緩存乒乓(cache ping-pong)[4]
- 8.2.3 不經意共享
- 8.2.4 數據的緊湊程度
- 8.2.5 過度任務切換與線程過飽和
- 8.3 設計數據結構以提升多線程程序的性能
- 8.3.1 針對復雜操作的數據劃分
- 8.3.2 其他數據結構的訪問模式
- 8.4 設計并發代碼時要額外考慮的因素
- 8.4.1 并行算法代碼中的異常安全
- 8.4.2 可伸縮性和Amdahl定律
- 8.4.3 利用多線程“掩藏”等待行為
- 8.4.4 借并發特性改進響應能力
- 8.5 并發代碼的設計實踐
- 8.5.1 std::for_each()的并行實現
- 8.5.2 std::find()的并行實現
- 8.5.3 std::partial_sum()的并行實現
- 8.6 小結
- 第9章 高級線程管理
- 9.1 線程池
- 9.1.1 最簡易可行的線程池
- 9.1.2 等待提交給線程池的任務完成運行
- 9.1.3 等待其他任務完成的任務
- 9.1.4 避免任務隊列上的爭奪
- 9.1.5 任務竊取
- 9.2 中斷線程
- 9.2.1 發起一個線程,以及把它中斷
- 9.2.2 檢測線程是否被中斷
- 9.2.3 中斷條件變量上的等待
- 9.2.4 中斷條件變量std::condition_variable_any上的等待
- 9.2.5 中斷其他阻塞型等待
- 9.2.6 處理中斷
- 9.2.7 在應用程序退出時中斷后臺任務
- 9.3 小結
- 第10章 并行算法函數
- 10.1 并行化的標準庫算法函數
- 10.2 執行策略
- 10.2.1 因指定執行策略而普遍產生的作用
- 10.2.2 std::execution::sequenced_policy
- 10.2.3 std::execution::parallel_policy
- 10.2.4 std::execution::parallel_unsequenced_policy
- 10.3 C++標準庫的并行算法函數
- 10.3.1 并行算法函數的使用范例
- 10.3.2 訪問計數
- 10.4 小結
- 第11章 多線程應用的測試和除錯
- 11.1 與并發相關的錯誤類型
- 11.1.1 多余的阻塞
- 11.1.2 條件競爭
- 11.2 定位并發相關的錯誤的技法
- 11.2.1 審查代碼并定位潛在錯誤
- 11.2.2 通過測試定位與并發相關的錯誤
- 11.2.3 設計可測試的代碼
- 11.2.4 多線程測試技術
- 11.2.5 以特定結構組織多線程的測試代碼
- 11.2.6 測試多線程代碼的性能
- 11.3 小結
- 附錄A C++11精要:部分語言特性
- 附錄B 各并發程序庫的簡要對比
- 附錄C 消息傳遞程序庫和完整的自動柜員機范例
- 附錄D C++11線程庫參考名錄 更新時間:2022-01-04 16:36:37