展开全部

主编推荐语

本书是介绍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名字空间
展开全部

评分及书评

评分不足
2个评分
  • 用户头像
    给这本书评了
    1.0

    翻译作者更本没有相关经验,基本术语想当然,读起来经常不通。读原版去了

      转发
      评论

    出版方

    人民邮电出版社

    人民邮电出版社是工业和信息化部主管的大型专业出版社,成立于1953年10月1日。人民邮电出版社坚持“立足信息产业、面向现代社会、传播科学知识、服务科教兴国”,致力于通信、计算机、电子技术、教材、少儿、经管、摄影、集邮、旅游、心理学等领域的专业图书出版。