更新时间:2022-01-04 16:36:37
封面
版权信息
版 权
版权声明
内容提要
作者简介
本书第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]