自我提升
类型
9.3
豆瓣评分
可以朗读
语音朗读
583千字
字数
2021-12-01
发行日期
展开全部
主编推荐语
本书是介绍C++并发和多线程编程的深度指南。
内容简介
本书从C++标准程序库的各种工具讲起,介绍线程管控、在线程间共享数据、并发操作的同步、C++内存模型和原子操作等内容。同时,本书还介绍基于锁的并发数据结构、无锁数据结构、并发代码,以及高级线程管理、并行算法函数、多线程应用的测试和除错。
本书还通过附录及线上资源提供丰富的补充资料,以帮助读者更完整、细致地掌握C++并发编程的知识脉络。本书适合需要深入了解C++多线程开发的读者,以及使用C++进行各类软件开发的开发人员、测试人员,还可以作为C++线程库的参考工具书。
目录
- 版权信息
- 版权声明
- 内容提要
- 作者简介
- 本书第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 符合并发技术规约的后续风格并发
- 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 原子操作的非成员函数
- 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 实现线程安全的无锁栈
- 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)
- 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精要:部分语言特性
- A.1 右值引用
- A.1.1 移动语义
- A.1.2 右值引用和函数模板
- A.2 删除函数
- A.3 默认函数
- A.4 常量表达式函数
- A.4.1 constexpr关键字和用户定义型别
- A.4.2 constexpr对象
- A.4.3 constexpr函数要符合的条件
- A.4.4 constexpr与模板
- A.5 lambda函数
- 涉及本地变量的lambda函数
- A.6 变参模板
- 展开参数包
- A.7 自动推导变量的型别
- A.8 线程局部变量
- A.9 类模板的参数推导
- A.10 小结
- 附录B 各并发程序库的简要对比
- 附录C 消息传递程序库和完整的自动柜员机范例
- 附录D C++11线程库参考名录
- D.1 <chrono>头文件
- D.1.1 std::chrono::duration类模板
- D.1.2 std::chrono::time_point类模板
- D.1.3 std::chrono::system_clock类
- D.1.4 std::chrono::steady_clock类
- D.1.5 std::chrono::high_resolution_clock typedef
- D.2 <condition_variable>头文件
- D.2.1 std::condition_variable类
- D.2.2 std::condition_variable_any类
- D.3 <atomic>头文件
- D.3.1 std::atomic_xxx类定义
- D.3.2 ATOMIC_xxx_LOCK_FREE宏
- D.3.3 ATOMIC_VAR_INIT宏
- D.3.4 std::memory_order枚举型别
- D.3.5 std::atomic_thread_fence()函数
- D.3.6 std::atomic_signal_fence()函数
- D.3.7 std::atomic_flag类
- D.3.8 std::atomic类模板
- D.3.9 类模板std::atomic的特化
- D.3.10 std::atomic<integral-type>特化
- D.3.11 std::atomic<T*>偏特化
- D.4 <future>头文件
- D.4.1 std::future类模板
- D.4.2 std::shared_future类模板
- D.4.3 std::packaged_task类模板
- D.4.4 std::promise类模板
- D.4.5 std::async()函数模板
- D.5 <mutex>头文件
- D.5.1 std::mutex类
- D.5.2 std::recursive_mutex类
- D.5.3 std::timed_mutex类
- D.5.4 std::recursive_timed_mutex类
- D.5.5 std::shared_mutex类
- D.5.6 std::shared_timed_mutex类
- D.5.7 std::lock_guard类模板
- D.5.8 std::scoped_lock类模板
- D.5.9 std::unique_lock类模板
- D.5.10 std::shared_lock类模板
- D.5.11 std::lock()函数模板
- D.5.12 std::try_lock()函数模板
- D.5.13 std::once_flag类
- D.5.14 std::call_once()函数模板
- D.6 <ratio>头文件
- D.6.1 std::ratio类模板
- D.6.2 std::ratio_add模板别名
- D.6.3 std::ratio_subtract模板别名
- D.6.4 std::ratio_multiply模板别名
- D.6.5 std::ratio_divide模板别名
- D.6.6 std::ratio_equal类模板
- D.6.7 std::ratio_not_equal类模板
- D.6.8 std::ratio_less类模板
- D.6.9 std::ratio_greater类模板
- D.6.10 std::ratio_less_equal类模板
- D.6.11 std::ratio_greater_equal类模板
- D.7 <thread>头文件
- D.7.1 std::thread类
- D.7.2 std::this_thread名字空间
展开全部
出版方
人民邮电出版社
人民邮电出版社是工业和信息化部主管的大型专业出版社,成立于1953年10月1日。人民邮电出版社坚持“立足信息产业、面向现代社会、传播科学知识、服务科教兴国”,致力于通信、计算机、电子技术、教材、少儿、经管、摄影、集邮、旅游、心理学等领域的专业图书出版。